Преглед на файлове

Maj graphique de story_details

olivier.massot преди 7 години
родител
ревизия
c8137c08d8
променени са 3 файла, в които са добавени 130 реда и са изтрити 104 реда
  1. 92 94
      main/models.py
  2. 1 0
      main/static/css/custom.css
  3. 37 10
      main/templates/story_details.html

+ 92 - 94
main/models.py

@@ -1,95 +1,93 @@
-
-from django.contrib.auth.models import User
-from django.db import models
-from martor.models import MartorField
-
-
-class BaseModel(models.Model):
-    created = models.DateTimeField(auto_now_add=True)
-    updated = models.DateTimeField(auto_now=True)
-    objects = models.Manager()
-    
-    class Meta:
-        abstract = True
-
-    def model_name(self):
-        return self._meta.verbose_name
-
-class Project(BaseModel):
-    class Meta:
-        verbose_name = "projet"
-        verbose_name_plural = "projets"
-        
-    name = models.CharField(max_length=200)
-    description = models.TextField(default="", blank=True)
-#     icon
-    owner = models.ForeignKey(User, 
-                               on_delete=models.PROTECT, 
-                               null=True,
-                               related_name="projects",
-                               related_query_name="project")
-    
-    def __str__(self):
-        return self.name
-    
-class Epic(BaseModel):
-    class Meta:
-        verbose_name = "epic"
-        verbose_name_plural = "epics"
-        ordering = ('-value', )
-        
-    SIZES = (("XXS","XXS (< 1 sprints)"), 
-             ("XS", "XS (1 sprint)"), 
-             ("S", "S (1-2 sprints)"), 
-             ("M", "M (2-3 sprints)"), 
-             ("L", "L (3-4 sprints)"), 
-             ("XL", "XL (4-6 sprints)"), 
-             ("XXL", "XXL  (> 6 sprints)"))
-    
-    name = models.CharField(max_length=200, default="")
-    size = models.CharField(max_length=10, default="M", choices=SIZES)
-    value = models.IntegerField(default=0)
-    description = models.TextField(default="", blank=True)
-    project = models.ForeignKey(Project, on_delete=models.PROTECT, null=True)
-    
-    def __str__(self):
-        return self.name
-    
-class Sprint(BaseModel):
-    class Meta:
-        verbose_name_plural = "sprint"
-        verbose_name_plural = "sprints"
-        ordering = ('date_start', )
-    date_start = models.DateField()
-    date_end = models.DateField()
-    
-        
-    def __str__(self):
-        return "Sprint #{} ({:%d/%m/%Y} > {:%d/%m/%Y})".format(self.id, self.date_start, self.date_end)
-    
-class Story(BaseModel):
-    class Meta:
-        verbose_name = "story"
-        verbose_name_plural = "stories"
-        ordering = ('-updated', )
-    epic = models.ForeignKey(Epic, on_delete=models.PROTECT, null=True)
-    name = models.CharField(max_length=200, default="")
-#     description = models.TextField(default="", blank=True)
-    description = MartorField()
-    closed = models.BooleanField(default=False)
-    author = models.ForeignKey(User, 
-                               on_delete=models.PROTECT, 
-                               null=True,
-                               related_name="stories",
-                               related_query_name="story")
-    
-    assignees = models.ManyToManyField(User, 
-                                       related_name="assigned")
-    
-    sprints = models.ManyToManyField(Sprint, 
-                                       related_name="stories",
-                                       related_query_name="story")
-    
-    def __str__(self):
-        return self.name
+
+from django.contrib.auth.models import User
+from django.db import models
+from martor.models import MartorField
+
+
+class BaseModel(models.Model):
+    created = models.DateTimeField(auto_now_add=True)
+    updated = models.DateTimeField(auto_now=True)
+    objects = models.Manager()
+    
+    class Meta:
+        abstract = True
+
+    def model_name(self):
+        return self._meta.verbose_name
+
+class Project(BaseModel):
+    class Meta:
+        verbose_name = "projet"
+        verbose_name_plural = "projets"
+        
+    name = models.CharField(max_length=200)
+    description = models.TextField(default="", blank=True)
+#     icon
+    owner = models.ForeignKey(User, 
+                               on_delete=models.PROTECT, 
+                               null=True,
+                               related_name="projects",
+                               related_query_name="project")
+    
+    def __str__(self):
+        return self.name
+    
+class Epic(BaseModel):
+    class Meta:
+        verbose_name = "epic"
+        verbose_name_plural = "epics"
+        ordering = ('-value', )
+        
+    SIZES = (("XXS","XXS (< 1 sprints)"), 
+             ("XS", "XS (1 sprint)"), 
+             ("S", "S (1-2 sprints)"), 
+             ("M", "M (2-3 sprints)"), 
+             ("L", "L (3-4 sprints)"), 
+             ("XL", "XL (4-6 sprints)"), 
+             ("XXL", "XXL  (> 6 sprints)"))
+    
+    name = models.CharField(max_length=200, default="")
+    size = models.CharField(max_length=10, default="M", choices=SIZES)
+    value = models.IntegerField(default=0)
+    description = models.TextField(default="", blank=True)
+    project = models.ForeignKey(Project, on_delete=models.PROTECT, null=True)
+    
+    def __str__(self):
+        return self.name
+    
+class Sprint(BaseModel):
+    class Meta:
+        verbose_name_plural = "sprint"
+        verbose_name_plural = "sprints"
+        ordering = ('date_start', )
+    date_start = models.DateField()
+    date_end = models.DateField()
+        
+    def __str__(self):
+        return "Sprint #{} ({:%d/%m/%Y} > {:%d/%m/%Y})".format(self.id, self.date_start, self.date_end)
+    
+class Story(BaseModel):
+    class Meta:
+        verbose_name = "story"
+        verbose_name_plural = "stories"
+        ordering = ('-updated', )
+    epic = models.ForeignKey(Epic, on_delete=models.PROTECT, null=True)
+    name = models.CharField(max_length=200, default="")
+    description = MartorField()
+    closed = models.BooleanField(default=False)
+    author = models.ForeignKey(User, 
+                               on_delete=models.PROTECT, 
+                               null=True,
+                               related_name="stories",
+                               related_query_name="story")
+    
+    assignees = models.ManyToManyField(User, 
+                                       related_name="assigned")
+    
+    sprints = models.ManyToManyField(Sprint, 
+                                       related_name="stories",
+                                       related_query_name="story")
+    
+    def __str__(self):
+        return self.name
     

+ 1 - 0
main/static/css/custom.css

@@ -80,6 +80,7 @@ select[multiple] {
 
 .tags-list li:not(:first-child) {
 	border-left: solid 1px #bfbfbf;
+	margin-left: 1em;
 }
 
 /* Index */

+ 37 - 10
main/templates/story_details.html

@@ -3,21 +3,48 @@
 {% block main %}
 	{% load martortags %}
 	
-	<header class="flex-row">
-		<h2 class="flex-extend">{{ story.name }}</h2>
-	
-		<ul class="actions small">
-			<li><a class="button special icon fa-edit tool-btn" href="{% url 'story_edit' story_id=story.id %}"></a></li>
-			<li><a class="button icon fa-trash tool-btn" href="{% url 'story_delete' story_id=story.id %}"></a></li>
-		</ul>
+	<header>
+		<blockquote class="annotation">Créée par {{ story.author.get_full_name }}, le {{ story.created }}</blockquote>
+		<div class="flex-row">
+			<h2 class="flex-extend">{{ story.name }}</h2>
+		
+			<ul class="actions small">
+				<li><a class="button special icon fa-edit tool-btn" href="{% url 'story_edit' story_id=story.id %}"></a></li>
+				<li><a class="button icon fa-trash tool-btn" href="{% url 'story_delete' story_id=story.id %}"></a></li>
+			</ul>
+		</div>
+		
 	</header>
 	
+	<hr>
+	
 	<div class="description">
 		{{ story.description|safe_markdown }}
 	</div>
 
-	<p>Auteur: {{ story.author.get_full_name }}</p>
-	<p>Assignée à: <ul class="tags-list">{% for user in story.assignees.all %}<li>{{ user.get_full_name }}</li>{% empty %}<li>(Aucun)</li>{% endfor %}</ul></p>
-	<p>Sprints: <ul class="tags-list">{% for sprint in story.sprints.all %}<li>{{ sprint }}</li>{% empty %}<li>(Aucun)</li>{% endfor %}</ul></p>
+	<hr>
+	
+	<div class="flex-row">
+		<h5>Assignée à</h5>
+		<ul class="tags-list">
+		{% for user in story.assignees.all %}
+			<li>{{ user.get_full_name }}</li>
+		{% empty %}
+			<li>(Aucun)</li>
+		{% endfor %}
+		</ul>
+	</div>
+	<div class="flex-row">
+		<h5>Sprints</h5>
+		<ul class="tags-list">
+		{% for sprint in story.sprints.all %}
+			<li>{{ sprint }}</li>
+		{% empty %}
+			<li>(Aucun)</li>
+		{% endfor %}
+		</ul>
+	</div>
+	
+	
 	
 {% endblock %}