소스 검색

remove cached migrations

omassot 7 년 전
부모
커밋
93867a367b

+ 0 - 114
main/migrations/0001_initial.py

@@ -1,114 +0,0 @@
-# Generated by Django 2.1.1 on 2018-10-29 07:59
-
-from django.conf import settings
-from django.db import migrations, models
-import django.db.models.deletion
-import martor.models
-import uuid
-
-
-class Migration(migrations.Migration):
-
-    initial = True
-
-    dependencies = [
-        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='Comment',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('created', models.DateTimeField(auto_now_add=True)),
-                ('updated', models.DateTimeField(auto_now=True)),
-                ('uuid', models.UUIDField(default=uuid.uuid4, editable=False)),
-                ('obj_uuid', models.UUIDField(default='')),
-                ('content', martor.models.MartorField(default='', verbose_name='Commentaire')),
-                ('author', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='Auteur')),
-            ],
-            options={
-                'verbose_name': 'commentaire',
-                'verbose_name_plural': 'commentaires',
-                'ordering': ('-created',),
-            },
-        ),
-        migrations.CreateModel(
-            name='Epic',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('created', models.DateTimeField(auto_now_add=True)),
-                ('updated', models.DateTimeField(auto_now=True)),
-                ('uuid', models.UUIDField(default=uuid.uuid4, editable=False)),
-                ('name', models.CharField(default='', max_length=200, verbose_name='Nom')),
-                ('size', models.CharField(choices=[('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)')], default='M', max_length=10, verbose_name='Taille')),
-                ('value', models.IntegerField(default=0, verbose_name='Valeur')),
-                ('description', martor.models.MartorField(blank=True, default='', verbose_name='Description')),
-                ('closed', models.BooleanField(default=False, verbose_name='Clôturée')),
-            ],
-            options={
-                'verbose_name': 'epic',
-                'verbose_name_plural': 'epics',
-                'ordering': ('-value',),
-            },
-        ),
-        migrations.CreateModel(
-            name='Project',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('created', models.DateTimeField(auto_now_add=True)),
-                ('updated', models.DateTimeField(auto_now=True)),
-                ('uuid', models.UUIDField(default=uuid.uuid4, editable=False)),
-                ('name', models.CharField(max_length=200)),
-                ('description', martor.models.MartorField(blank=True, default='', verbose_name='Description')),
-                ('color', models.CharField(default='#f6755e', max_length=7)),
-            ],
-            options={
-                'verbose_name': 'projet',
-                'verbose_name_plural': 'projets',
-            },
-        ),
-        migrations.CreateModel(
-            name='Sprint',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('created', models.DateTimeField(auto_now_add=True)),
-                ('updated', models.DateTimeField(auto_now=True)),
-                ('uuid', models.UUIDField(default=uuid.uuid4, editable=False)),
-                ('date_start', models.DateField()),
-                ('date_end', models.DateField()),
-                ('retro', martor.models.MartorField(blank=True, default='', verbose_name='Bilan / Rétrospective')),
-            ],
-            options={
-                'verbose_name_plural': 'sprints',
-                'ordering': ('-date_start',),
-            },
-        ),
-        migrations.CreateModel(
-            name='Story',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('created', models.DateTimeField(auto_now_add=True)),
-                ('updated', models.DateTimeField(auto_now=True)),
-                ('uuid', models.UUIDField(default=uuid.uuid4, editable=False)),
-                ('name', models.CharField(default='', max_length=200, verbose_name='Nom')),
-                ('weight', models.IntegerField(blank=True, choices=[(1, 1), (2, 2), (3, 3), (5, 5), (8, 8), (13, 13), (21, 21)], verbose_name='Poids')),
-                ('description', martor.models.MartorField(blank=True, default='', verbose_name='Description')),
-                ('closed', models.BooleanField(default=False, verbose_name='Clôturée')),
-                ('assignees', models.ManyToManyField(blank=True, related_name='assigned', to=settings.AUTH_USER_MODEL, verbose_name='Assignés')),
-                ('author', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='stories', related_query_name='story', to=settings.AUTH_USER_MODEL, verbose_name='Auteur')),
-                ('epic', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='stories', to='main.Epic', verbose_name='Epic')),
-                ('sprints', models.ManyToManyField(blank=True, related_name='stories', related_query_name='story', to='main.Sprint', verbose_name='Sprints')),
-            ],
-            options={
-                'verbose_name': 'story',
-                'verbose_name_plural': 'stories',
-                'ordering': ('closed', '-updated'),
-            },
-        ),
-        migrations.AddField(
-            model_name='epic',
-            name='project',
-            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='main.Project', verbose_name='Projet'),
-        ),
-    ]

+ 0 - 18
main/migrations/0002_sprint_closed.py

@@ -1,18 +0,0 @@
-# Generated by Django 2.1.1 on 2018-11-12 14:05
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('main', '0001_initial'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='sprint',
-            name='closed',
-            field=models.BooleanField(default=False, verbose_name='Terminé'),
-        ),
-    ]

+ 0 - 24
main/migrations/0003_member.py

@@ -1,24 +0,0 @@
-# Generated by Django 2.1.1 on 2018-11-12 15:59
-
-from django.conf import settings
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
-        ('main', '0002_sprint_closed'),
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='Member',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('trigram', models.CharField(max_length=5)),
-                ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
-            ],
-        ),
-    ]

+ 0 - 0
main/migrations/__init__.py


+ 0 - 2
main/models.py

@@ -10,8 +10,6 @@ from django.core import serializers
 from django.db import models, connection
 from django.db.models.aggregates import Sum
 from martor.models import MartorField
-from notifications.signals import notify
-
 
 class Member(models.Model):
     user = models.OneToOneField(User, on_delete=models.CASCADE)

+ 6 - 4
main/static/js/custom.js

@@ -4,10 +4,12 @@ $(document).ready( function () {
     	window.location.href = $(this).data('url');
 	});
 	
-	$('option').mousedown(function(e) {
-	    e.preventDefault();
-	    $(this).prop('selected', !$(this).prop('selected'));
-	    return false;
+	$('select[multiple] > option').mousedown(function(e) {
+		if(e.which==1) {
+		    e.preventDefault();
+		    $(this).prop('selected', !$(this).prop('selected'));
+		    return false;
+		}
 	});
 	
 	var loc_uri = URI.parse(window.location.href);

+ 11 - 10
main/templates/epic_details.html

@@ -15,20 +15,21 @@
 	{% load martortags %}
 	
 	<header>
-		<div class="flex-row">
-			<h2 class="flex-extend">{{ epic.name }}</h2>
-		
-			<ul class="actions small">
-				<li><a class="button special icon fa-edit tool-btn" href="{% url 'epic_edit' epic_id=epic.id %}" title="Modifier"></a></li>
-				<!-- <li><a class="button icon fa-trash tool-btn" href="{% url 'epic_delete' epic_id=epic.id %}"></a></li> -->
-			</ul>
+		<div class="flex-row flex-space-around" style="margin-bottom: 1em;">
+			<h2>
+				{{ epic.name }} 
+				<sup><a href="{% url 'epic_edit' epic_id=epic.id %}" style="margin-left: 5px;"><i class="fa fa-pencil"></i></a></sup>
+			</h2>
 		</div>
 		
 	</header>
 
-	<div class="flex-row flex-space-around">
-		<span>Taille: <b>{{ epic.size }}</b></span>
-		<span>Valeur: <b>{{ epic.value }}</b></span>
+	<div class="flex-row flex-space-around" style="font-size: 16px;">
+		<b>{{ epic.size }}</b>
+		
+		<div>Stories: 
+		<span class="valid">{{ epic.nb_active_stories }}</span> / 
+		<span class="disabled">{{ epic.nb_closed_stories }}</span></div>
 	</div>
 	
 	<hr>

+ 1 - 1
main/templates/index.html

@@ -36,7 +36,7 @@
 			
 			<tr data-url="{% url 'epic_details' epic_id=epic.id %}">
 				<td>
-					<i class="fa fa-circle" style="margin-right: 0.5em; color:{{ epic.project.color }};" title="{{ epic.project.name }}"></i> 
+					<i class="fa fa-sticky-note" style="margin-right: 0.5em; color:{{ epic.project.color }};" title="Projet: {{ epic.project.name }}"></i> 
 					<a href="{% url 'epic_details' epic_id=epic.id %}">
 						{% if epic.value > 0 %}
 							<b>{{ epic.name }}</b>

+ 17 - 7
main/templates/story_details.html

@@ -25,20 +25,30 @@
 				Epic: <a href="{% url 'epic_details' epic_id=story.epic.id %}">{{ story.epic.name }}</a>
 			</span>
 			{% endif %}
+			
 			<blockquote class="annotation">Créée par {{ story.author.get_full_name }}, le {{ story.created }}</blockquote>
+			
+
 		</div>
 		<div class="flex-row title-bar">
-			{% if story.weight %}
-			<span style="margin-right: 10px;">{% include 'weight_svg.html' with weight=story.weight h=36 %}</span>
-			{% endif %}
 			
-			{% if story.closed %}
-				<h2 class="flex-extend" style="color: grey;">[Terminée] {{ story.name }}</h2>
-			{% else %}
-				<h2 class="flex-extend">{{ story.name }}</h2>
+
+			
+			<h2 class="flex-extend">
+				<i class="fa fa-sticky-note" style="color:{{ story.epic.project.color }};margin-right: 10px;" title="Projet: {{ story.epic.project.name }}"></i>
+				{% if story.closed %}
+					 <span style="color: grey;">[Terminée] {{ story.name }}</span>
+				{% else %}
+					{{ story.name }}
+				{% endif %}
+			</h2>
+			
+			{% if story.weight %}
+				<span style="margin-right: 10px;">{% include 'weight_svg.html' with weight=story.weight h=36 %}</span>
 			{% endif %}
 			
 			<ul class="actions small">
+				
 				{% if story.closed %}
 					<li><a class="button alt icon fa-folder-open tool-btn" href="{% url 'story_reopen' story_id=story.id %}" title="Ré-ouvrir">Ré-ouvrir</a></li>
 				{% else %}

+ 2 - 1
requirements.txt

@@ -2,4 +2,5 @@ psycopg2-binary
 Django
 martor
 path.py>=11.1.0
-mod_wsgi
+mod_wsgi
+django-notifications-hq

+ 10 - 3
todo.txt

@@ -1,7 +1,14 @@
 
-* commentaires: permettre de modifier / supprimer
+* suivi de projets: permettre l'ajout/edition d'une actu par epic; afficher la date de dernière mise à jour
+* trouver sous quelle forme stocker l'actu
+* réfléchir à stocker en base les indicateurs (nb_stories, running, velocité...)
+* compléter le rapport d'activité
+* vérifier la sauvegarde sur le serveur
+x différencier l'affichage des epics et des stories
+
 
 long-terme:
-* ajouter une page de fin/debut de sprint (parcourir les stories, clore ou reconduire chacune, ajouter retro)
+x ajouter une page de fin/debut de sprint (parcourir les stories, clore ou reconduire chacune, ajouter retro)
 * signaler évènements par mail: commentaires, assignation, clotures...
-* Ajouter un graphe 'activité' pour chaque epic
+x Ajouter un graphe 'activité'
+* ajouter une liste deroulante dynamique à la barre de recherche