omassot před 6 roky
rodič
revize
7472b1984a

+ 4 - 4
main/admin.py

@@ -7,16 +7,16 @@ admin.site.register(Comment)
 
 @admin.register(Project)
 class ProjectAdmin(admin.ModelAdmin):
-    list_display = ('id', 'name')
+    list_display = ('name', 'id')
 
 @admin.register(Epic)
 class EpicAdmin(admin.ModelAdmin):
-    list_display = ('id', 'name', 'size', 'value', 'closed')
+    list_display = ('name', 'size', 'value', 'closed', 'id')
 
 @admin.register(Story)
 class StoryAdmin(admin.ModelAdmin):
-    list_display = ('id', 'name', 'weight', 'closed')
+    list_display = ('name', 'weight', 'closed', 'id')
 
 @admin.register(Sprint)
 class SprintAdmin(admin.ModelAdmin):
-    list_display = ('id', 'date_start', 'date_end', 'closed')
+    list_display = ('number', 'date_start', 'date_end', 'closed', 'id')

+ 9 - 0
main/models.py

@@ -172,8 +172,17 @@ class Sprint(BaseModel):
         except IndexError:
             return None
 
+    @classmethod
+    def previous(cls):
+        """ the previous sprint is the last closed sprint """
+        try:
+            return Sprint.objects.filter(closed = True).order_by('-number')[0]
+        except IndexError:
+            return None
+
     @classmethod
     def next(cls):
+        """ the next sprint is the second non-closed sprint """
         try:
             return Sprint.objects.filter(closed = False).order_by('number')[1]
         except IndexError:

+ 5 - 2
main/static/css/custom.css

@@ -214,6 +214,7 @@ select[multiple] option {
 .dropdown {
     position: relative;
     display: inline-block;
+    line-height: 4em;
 }
 
 /* Dropdown Content (Hidden by Default) */
@@ -234,11 +235,11 @@ select[multiple] option {
     padding: 0 16px;
     text-decoration: none;
     display: block;
-
 }
 
 .dropdown-content>a {
     width: 100%;
+    border-bottom: solid 1px #cccccc;
 }
 
 #notif-dropdown {
@@ -247,7 +248,9 @@ select[multiple] option {
 
 /* Change color of dropdown links on hover */
 .dropdown-content a:hover {
-	text-decoration: underline !important;
+	/* text-decoration: underline !important; */
+	font-weight: 900;
+	background-color: #ff9966;
 }
 
 /* Show the dropdown menu (use JS to add this class to the .dropdown-content container when the user clicks on the dropdown button) */

+ 15 - 0
main/static/js/custom.js

@@ -107,6 +107,11 @@ $(document).ready( function () {
 	    		$('#notif-dropdown').hide();
 	    	}
 	    }
+	    if(!$(event.target).closest('#stories-panel').length) {
+	    	if($('#stories-dropdown').is(":visible")) {
+	    		$('#stories-dropdown').hide();
+	    	}
+	    }
 	});
 	
 	$(document).on('click', '#user-show-btn', function(event) {
@@ -119,6 +124,16 @@ $(document).ready( function () {
 		}
 	});
 	
+	$(document).on('click', '#stories-show-btn', function(event) {
+		event.preventDefault();
+		if($('#stories-dropdown').is(":visible")) {
+			$('#stories-dropdown').hide();
+		}
+		else {
+			$('#stories-dropdown').show();
+		}
+	});
+	
 	$(document).on('click', '#notif-show-btn', function(event) {
 		event.preventDefault();
 		if($('#notif-dropdown').is(":visible")) {

+ 16 - 3
main/templates/_layout.html

@@ -99,10 +99,23 @@
 	        			<i class="fa fa-plus" style="color:#4183c4;"></i><span class="hide-on-medium-screen"> Nouvelle Story</span>
 	        		</a>
 	        		
-	        		<a class="tool-btn" href="{% url 'story_index' %}?assignee={{ request.user.id }}" style="margin-right: 1em;" title="Mes Stories">
-	        			<i class="fa fa-check-square-o" style="color:#4183c4;"></i><span class="hide-on-medium-screen"> Mes Stories</span>
-	        		</a>
+	        		<div id="stories-panel" class="dropdown">
+	        			<a href="{% url 'story_index' %}?assignee={{ request.user.id }}" id="stories-show-btn">
+	        			     <i class="fa fa-check-square-o"></i>
+	        			     <span class="hide-on-medium-screen"> Mes Stories</span>
+	        			     <i class="fa fa-caret-down" style="margin-left: 0.5em;"></i>
+	        			</a>
 	        		
+						<div id="stories-dropdown" class="dropdown-content">
+							<a href="{% url 'story_index' %}?assignee={{ request.user.id }}">Mes Stories</a>
+							<a href="{% url 'story_index_cur' %}">Sprint en cours</a>
+							<a href="{% url 'story_index_prev' %}">Sprint précédent</a>
+							<a href="{% url 'story_index_next' %}">Sprint suivant</a>
+							<a href="{% url 'story_index' %}?sprint=None">En attente</a>
+							<a href="{% url 'story_index' %}">Toutes</a>
+						</div>
+					</div>
+					
 	        		<div id="user-panel" class="dropdown">
 	        			<a href="" id="user-show-btn"><i class="fa fa-user"></i><span class="hide-on-medium-screen"> {{ request.user.first_name }} {{ request.user.last_name }}</span> <i class="fa fa-caret-down" style="margin-left: 0.5em;"></i></a>
 	        		

+ 3 - 0
main/urls.py

@@ -22,6 +22,9 @@ urlpatterns = [
     path('sprintnew/', views.sprint_new, name='sprint_new'),
     path('stories/', views.story_index, name='story_index'),
     path('stories/<int:story_id>', views.story_details, name='story_details'),
+    path('stories/cur/', views.story_index_cur, name='story_index_cur'),
+    path('stories/prev/', views.story_index_prev, name='story_index_prev'),
+    path('stories/next/', views.story_index_next, name='story_index_next'),
     path('stories/create/', views.story_create, name='story_create'),
     path('stories/create/<int:epic_id>/', views.story_create, name='story_create'),
     path('stories/edit/<int:story_id>/', views.story_edit, name='story_edit'),

+ 33 - 1
main/views.py

@@ -162,7 +162,39 @@ def story_index(request):
                                                 'sprints': sprints, 
                                                 'users': users, 
                                                 'pages': range(1, paginator.num_pages + 1)})
-
+              
+@login_required                                  
+def story_index_cur(request):
+    current_sprint = Sprint.current()
+    if not current_sprint:
+        messages.error(request, "Aucun sprint en cours")
+        return redirect("story_index")
+    
+#     request.GET['sprint'] = current_sprint.id
+#     return redirect('story_index', sprint_id=current_sprint.id)      
+    return redirect("{}?sprint={}".format(reverse('story_index'), current_sprint.id))
+              
+@login_required                                  
+def story_index_prev(request):
+    previous_sprint = Sprint.previous()
+    if not previous_sprint:
+        messages.error(request, "Le sprint précédent n'existe pas")
+        return redirect("story_index")
+    
+#     request.GET['sprint'] = previous_sprint.id
+    return redirect("{}?sprint={}".format(reverse('story_index'), previous_sprint.id))
+
+@login_required                                  
+def story_index_next(request):
+    next_sprint = Sprint.next()
+    if not next_sprint:
+        messages.error(request, "Le sprint suivant n'a pas encore été créé")
+        return redirect("story_index")
+    
+#     request.GET['sprint'] = next_sprint.id
+#     return redirect('story_index', sprint_id=next_sprint.id)             
+    return redirect("{}?sprint={}".format(reverse('story_index'), next_sprint.id))                    
+                                                
 @login_required
 def story_details(request, story_id):
     story = get_object_or_404(Story, id=story_id)