summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/it/forms.py3
-rw-r--r--apps/it/migrations/0013_auto__add_field_issue_progress.py126
-rw-r--r--apps/it/migrations/0014_auto__add_field_asset_product_url.py127
-rw-r--r--apps/it/models.py19
-rw-r--r--apps/it/static/js/it.js10
-rwxr-xr-xapps/it/templates/default.html10
-rw-r--r--apps/it/templates/edit_task.html1
-rw-r--r--apps/it/templates/view_issue.html2
-rw-r--r--apps/it/views.py8
9 files changed, 295 insertions, 11 deletions
diff --git a/apps/it/forms.py b/apps/it/forms.py
index 2383374..aa8ab58 100644
--- a/apps/it/forms.py
+++ b/apps/it/forms.py
@@ -38,7 +38,8 @@ class TaskForm(forms.ModelForm):
model = Task
widgets = {
'description': SmallTextarea,
- 'due_date': SelectDateWidget
+ 'due_date': forms.TextInput(attrs={'class': 'datepicker'}),
+ 'completed_at': forms.TextInput(attrs={'class': 'datepicker'})
}
class SimpleTaskForm(forms.ModelForm):
diff --git a/apps/it/migrations/0013_auto__add_field_issue_progress.py b/apps/it/migrations/0013_auto__add_field_issue_progress.py
new file mode 100644
index 0000000..b056638
--- /dev/null
+++ b/apps/it/migrations/0013_auto__add_field_issue_progress.py
@@ -0,0 +1,126 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+ # Adding field 'Issue.progress'
+ db.add_column(u'it_issue', 'progress',
+ self.gf('django.db.models.fields.PositiveIntegerField')(default=0),
+ keep_default=False)
+
+
+ def backwards(self, orm):
+ # Deleting field 'Issue.progress'
+ db.delete_column(u'it_issue', 'progress')
+
+
+ models = {
+ u'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ u'auth.permission': {
+ 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ u'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ u'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ u'it.article': {
+ 'Meta': {'object_name': 'Article'},
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+ 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'note': ('django.db.models.fields.TextField', [], {}),
+ 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'title': ('django.db.models.fields.CharField', [], {'default': "u'New Article'", 'max_length': '256'})
+ },
+ u'it.asset': {
+ 'Meta': {'object_name': 'Asset'},
+ 'contact': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+ 'description': ('django.db.models.fields.TextField', [], {}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'ip_address': ('django.db.models.fields.IPAddressField', [], {'default': "''", 'max_length': '15'}),
+ 'issues': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['it.Issue']", 'null': 'True', 'symmetrical': 'False'}),
+ 'kind': ('django.db.models.fields.CharField', [], {'default': "'SERVER'", 'max_length': '128'}),
+ 'location': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+ 'name': ('django.db.models.fields.CharField', [], {'default': "'New Asset'", 'max_length': '256'})
+ },
+ u'it.attachment': {
+ 'Meta': {'object_name': 'Attachment'},
+ 'attachment': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+ 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {})
+ },
+ u'it.issue': {
+ 'Meta': {'ordering': "['-priority', 'created_at']", 'object_name': 'Issue'},
+ 'assigned_to': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'issues'", 'null': 'True', 'to': u"orm['auth.User']"}),
+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
+ 'description': ('django.db.models.fields.TextField', [], {}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'priority': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+ 'progress': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+ 'state': ('django.db.models.fields.CharField', [], {'default': "'NEW'", 'max_length': '32'}),
+ 'title': ('django.db.models.fields.CharField', [], {'default': "u'New Issue'", 'max_length': '256'}),
+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'users': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'metoo'", 'null': 'True', 'to': u"orm['auth.User']"})
+ },
+ u'it.taggeditem': {
+ 'Meta': {'unique_together': "(('content_type', 'object_id', 'tag'),)", 'object_name': 'TaggedItem'},
+ 'color': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '8'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+ 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
+ 'tag': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+ },
+ u'it.task': {
+ 'Meta': {'ordering': "['-created_at']", 'object_name': 'Task'},
+ 'assigned_to': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tasks'", 'null': 'True', 'to': u"orm['auth.User']"}),
+ 'completed_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
+ 'description': ('django.db.models.fields.TextField', [], {}),
+ 'due_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'issue': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['it.Issue']", 'null': 'True'}),
+ 'step': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
+ }
+ }
+
+ complete_apps = ['it'] \ No newline at end of file
diff --git a/apps/it/migrations/0014_auto__add_field_asset_product_url.py b/apps/it/migrations/0014_auto__add_field_asset_product_url.py
new file mode 100644
index 0000000..2d62168
--- /dev/null
+++ b/apps/it/migrations/0014_auto__add_field_asset_product_url.py
@@ -0,0 +1,127 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+ # Adding field 'Asset.product_url'
+ db.add_column(u'it_asset', 'product_url',
+ self.gf('django.db.models.fields.URLField')(max_length=200, null=True, blank=True),
+ keep_default=False)
+
+
+ def backwards(self, orm):
+ # Deleting field 'Asset.product_url'
+ db.delete_column(u'it_asset', 'product_url')
+
+
+ models = {
+ u'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ u'auth.permission': {
+ 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ u'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ u'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ u'it.article': {
+ 'Meta': {'object_name': 'Article'},
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+ 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'note': ('django.db.models.fields.TextField', [], {}),
+ 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'title': ('django.db.models.fields.CharField', [], {'default': "u'New Article'", 'max_length': '256'})
+ },
+ u'it.asset': {
+ 'Meta': {'object_name': 'Asset'},
+ 'contact': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+ 'description': ('django.db.models.fields.TextField', [], {}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'ip_address': ('django.db.models.fields.IPAddressField', [], {'default': "''", 'max_length': '15'}),
+ 'issues': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['it.Issue']", 'null': 'True', 'symmetrical': 'False'}),
+ 'kind': ('django.db.models.fields.CharField', [], {'default': "'SERVER'", 'max_length': '128'}),
+ 'location': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+ 'name': ('django.db.models.fields.CharField', [], {'default': "'New Asset'", 'max_length': '256'}),
+ 'product_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
+ },
+ u'it.attachment': {
+ 'Meta': {'object_name': 'Attachment'},
+ 'attachment': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+ 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {})
+ },
+ u'it.issue': {
+ 'Meta': {'ordering': "['-priority', 'created_at']", 'object_name': 'Issue'},
+ 'assigned_to': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'issues'", 'null': 'True', 'to': u"orm['auth.User']"}),
+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
+ 'description': ('django.db.models.fields.TextField', [], {}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'priority': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+ 'progress': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+ 'state': ('django.db.models.fields.CharField', [], {'default': "'NEW'", 'max_length': '32'}),
+ 'title': ('django.db.models.fields.CharField', [], {'default': "u'New Issue'", 'max_length': '256'}),
+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'users': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'metoo'", 'null': 'True', 'to': u"orm['auth.User']"})
+ },
+ u'it.taggeditem': {
+ 'Meta': {'ordering': "['tag']", 'unique_together': "(('content_type', 'object_id', 'tag'),)", 'object_name': 'TaggedItem'},
+ 'color': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '8'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+ 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
+ 'tag': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+ },
+ u'it.task': {
+ 'Meta': {'ordering': "['-created_at']", 'object_name': 'Task'},
+ 'assigned_to': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tasks'", 'null': 'True', 'to': u"orm['auth.User']"}),
+ 'completed_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
+ 'description': ('django.db.models.fields.TextField', [], {}),
+ 'due_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'issue': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['it.Issue']", 'null': 'True'}),
+ 'step': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
+ }
+ }
+
+ complete_apps = ['it'] \ No newline at end of file
diff --git a/apps/it/models.py b/apps/it/models.py
index f1d95cc..fc82cc8 100644
--- a/apps/it/models.py
+++ b/apps/it/models.py
@@ -31,6 +31,7 @@ class TaggedItem(AbstractGenericItem):
return self.tag
class Meta:
+ ordering = ['tag']
unique_together = ("content_type", "object_id", "tag",)
@@ -75,10 +76,23 @@ class Issue(models.Model):
created_by = models.ForeignKey(User, editable=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
+ progress = models.PositiveIntegerField(default=0, editable=False)
def __unicode__(self):
return self.description
+ def set_progress(self):
+ self.progress = self.get_progress()
+ self.save()
+
+ def get_progress(self):
+ all = self.task_set.all().count()
+ if all < 1:
+ return 0
+ done = self.task_set.exclude(completed_at=None).count()
+ print done/all*100
+ return done/all*100
+
def get_content_type(self):
return ContentType.objects.get_for_model(self)
@@ -104,6 +118,10 @@ class Task(models.Model):
completed_at = models.DateTimeField(null=True, blank=True)
files = generic.GenericRelation(Attachment)
+ def save(self):
+ super(Task, self).save()
+ self.issue.set_progress()
+
def __unicode__(self):
return self.description
@@ -116,6 +134,7 @@ class Asset(models.Model):
description = models.TextField()
location = models.CharField(max_length=256)
ip_address = models.IPAddressField(default='')
+ product_url = models.URLField(null=True, blank=True)
issues = models.ManyToManyField(Issue, null=True)
files = generic.GenericRelation(Attachment)
KINDS = (
diff --git a/apps/it/static/js/it.js b/apps/it/static/js/it.js
index 9a05b0a..b347774 100644
--- a/apps/it/static/js/it.js
+++ b/apps/it/static/js/it.js
@@ -7,7 +7,7 @@ $('.media').hover(
});
Dropzone.options.myAwesomeDropzone = {
paramName: "attachment", // The name that will be used to transfer the file
- maxFilesize: 2, // MB
+ maxFilesize: 20, // MB
};
$('.confirm').click(function(e){
if(confirm('Are you sure?')) {
@@ -23,10 +23,16 @@ $('.media').hover(
$('.autocomplete').each(function(i, e){
$(e).autocomplete({source: $(e).data('source')});
});
- $('.draggable').draggable({opacity: 0.75, zIndex: 100, cursor: 'pointer'});
+ $('.draggable').draggable({
+ opacity: 0.75,
+ zIndex: 100,
+ cursor: 'pointer'
+ });
$('.dragarea').droppable({
out: function(e, ui) {
$.ajax($(ui.draggable).data('destroy'));
$(ui.draggable).remove();
}
});
+
+$('.datepicker').datepicker({dateFormat: "yy-mm-dd"});
diff --git a/apps/it/templates/default.html b/apps/it/templates/default.html
index c163995..d1738a4 100755
--- a/apps/it/templates/default.html
+++ b/apps/it/templates/default.html
@@ -146,12 +146,13 @@
<i class="fa fa-tasks fa-fw"></i> <i class="fa fa-caret-down"></i>
</a>
<ul class="dropdown-menu dropdown-tasks">
+ {% for i in request.user.issues.all %}
<li>
- <a href="#">
+ <a href="{{ i.get_absolute_url }}">
<div>
<p>
- <strong>Task 1</strong>
- <span class="pull-right text-muted">40% Complete</span>
+ <strong>{{ i.title }}</strong>
+ <span class="pull-right text-muted">{{ i.progress }}% Complete</span>
</p>
<div class="progress progress-striped active">
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 40%">
@@ -162,6 +163,7 @@
</a>
</li>
<li class="divider"></li>
+ {% endfor %}
<li>
<a href="#">
<div>
@@ -241,7 +243,7 @@
<ul class="nav" id="side-menu">
<li class="sidebar-search">
<div class="input-group custom-search-form">
- <input type="text" class="form-control searchfield" placeholder="Search...">
+ <input type="text" class="form-control searchfield" placeholder="Search..."/>
<span class="input-group-btn">
<button class="btn btn-default" type="button">
<i class="fa fa-search"></i>
diff --git a/apps/it/templates/edit_task.html b/apps/it/templates/edit_task.html
index 30435e4..03bf18c 100644
--- a/apps/it/templates/edit_task.html
+++ b/apps/it/templates/edit_task.html
@@ -6,6 +6,7 @@
<form action="" method="post" class="form">
{% csrf_token %}
{% bootstrap_form form %}
+ <a class="btn btn-default" href="{{ task.issue.get_absolute_url }}">{% trans "Cancel" %}</a>
<button type="submit" class="btn btn-primary">{% trans "Save" %}</button>
</form>
{% endblock main %}
diff --git a/apps/it/templates/view_issue.html b/apps/it/templates/view_issue.html
index b60afb2..e8adb8e 100644
--- a/apps/it/templates/view_issue.html
+++ b/apps/it/templates/view_issue.html
@@ -51,7 +51,7 @@
{% endblock main %}
{% block inspector %}
-{% if 1 %}
+{% if request.user in issue.users.all %}
<a class="btn btn-sm btn-default btn-primary active" href="{% url 'metoo' issue.pk 1 %}">{% bootstrap_icon "star" %} {% trans "Me too!" %}</a>
{% else %}
<a class="btn btn-sm btn-default btn-primary" href="{% url 'metoo' issue.pk 1 %}">{% bootstrap_icon "star" %} {% trans "Me too!" %}</a>
diff --git a/apps/it/views.py b/apps/it/views.py
index 963f41f..2461560 100644
--- a/apps/it/views.py
+++ b/apps/it/views.py
@@ -170,15 +170,17 @@ def tags(request):
ctype = request.GET.get('ctype')
term = request.GET.get('term')
- if oid and ctype :
+ if oid and ctype:
query = query.exclude(object_id=oid, content_type=ctype)
if term:
query = query.filter(tag__icontains=term)
- tags = query.values_list('tag', flat=True)
- return HttpResponse(json.dumps(list(tags)), content_type="application/javascript")
+ # DISTINCT ON fields is not supported by this database backend
+ tags = list()
+ [tags.append(x.tag) for x in query if x.tag not in tags]
+ return HttpResponse(json.dumps(tags), content_type="application/javascript")
def users(request):
object_list = User.objects.all()