iconolab profile to user relation is now one to one field + added panel for collection admin user tools (to be added) in user home + (simple) django admin for iconolab objects
authordurandn
Wed, 17 Aug 2016 14:38:22 +0200
changeset 133 088195b2a6cc
parent 132 4728f6c0102e
child 134 350bdfe7c289
iconolab profile to user relation is now one to one field + added panel for collection admin user tools (to be added) in user home + (simple) django admin for iconolab objects
src/iconolab/admin.py
src/iconolab/migrations/0012_auto_20160817_1019.py
src/iconolab/models.py
src/iconolab/templates/iconolab/user_home.html
--- a/src/iconolab/admin.py	Tue Aug 16 17:02:57 2016 +0200
+++ b/src/iconolab/admin.py	Wed Aug 17 14:38:22 2016 +0200
@@ -1,1 +1,20 @@
-from django.contrib import admin
\ No newline at end of file
+from django.contrib import admin
+from iconolab import models
+
+# Iconolab objects
+admin.site.register(models.Collection)
+admin.site.register(models.Item)
+admin.site.register(models.Image)
+admin.site.register(models.Annotation)
+admin.site.register(models.AnnotationRevision)
+# Tags
+admin.site.register(models.Tag)
+admin.site.register(models.TaggingInfo)
+
+# User
+admin.site.register(models.UserProfile)
+
+# Comment system
+admin.site.register(models.IconolabComment)
+admin.site.register(models.MetaCategory)
+admin.site.register(models.MetaCategoryInfo)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/iconolab/migrations/0012_auto_20160817_1019.py	Wed Aug 17 14:38:22 2016 +0200
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.7 on 2016-08-17 10:19
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('iconolab', '0011_userprofile'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='userprofile',
+            name='user',
+            field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='user', to=settings.AUTH_USER_MODEL),
+        ),
+    ]
--- a/src/iconolab/models.py	Tue Aug 16 17:02:57 2016 +0200
+++ b/src/iconolab/models.py	Wed Aug 17 14:38:22 2016 +0200
@@ -19,12 +19,17 @@
     def is_internal(self):
         return self.link.startswith(settings.INTERNAL_TAGS_URL)
 
+    def __str__(self):
+        return self.label_slug+":"+self.label
 
 class TaggingInfo(models.Model):
     revision = models.ForeignKey('AnnotationRevision', on_delete=models.CASCADE)
     tag = models.ForeignKey('Tag', on_delete=models.CASCADE)
     accuracy = models.IntegerField()
     relevancy = models.IntegerField()
+    
+    def __str__(self):
+        return self.tag.label_slug+":to:"+self.revision.revision_guid
 
 
 class Collection(models.Model):
@@ -42,7 +47,9 @@
 class Item(models.Model):
     collection = models.ForeignKey(Collection, related_name="items")
     item_guid = models.UUIDField(default=uuid.uuid4, editable=False)
-
+    
+    def __str__(self):
+        return str(self.item_guid)+":from:"+self.collection.name
     
 class ItemMetadata(models.Model):
     item = models.OneToOneField('Item', related_name='metadatas')
@@ -62,6 +69,9 @@
     @property
     def get_joconde_url(self):
         return self.joconde_ref
+    
+    def __str__(self):
+        return "metadatas:for:"+str(self.item.item_guid)
 
 
 class ImageStats(models.Model):
@@ -73,6 +83,9 @@
     folders_inclusion_count = models.IntegerField(blank=True, null=True, default=0)
     tag_count = models.IntegerField(blank=True, null=True, default=0)
     
+    def __str__(self):
+        return "stats:for:"+self.image.image_guid
+    
     def set_tags_stats(self):
         self.tag_count = Tag.objects.filter(tagginginfo__revision__annotation__image = self.image).distinct().count()
     
@@ -106,7 +119,10 @@
     height = models.IntegerField(null=False, blank=False)
     width = models.IntegerField(null=False, blank=False)
     created = models.DateTimeField(auto_now_add=True, null=True)
-
+    
+    def __str__(self):
+        return str(self.image_guid)+":"+self.name
+    
     @property
     def collection(self):
         return self.item.collection.name
@@ -139,9 +155,6 @@
     def measurements(self):
         return self.item.metadatas.measurements
 
-    def __str__(self):
-        return self.name
-
     @property
     def tags(self):
         tag_list = []
@@ -196,6 +209,9 @@
     comments_count = models.IntegerField(blank=True, null=True, default=0)
     tag_count = models.IntegerField(blank=True, null=True, default=0)
     
+    def __str__(self):
+        return "stats:for:"+str(self.annotation_guid)
+    
     @property
     def contributors(self):
         user_ids_list = self.annotation.revisions.filter(state__in=[AnnotationRevision.ACCEPTED, AnnotationRevision.STUDIED]).values_list("author__id", flat=True)
@@ -241,6 +257,9 @@
     
     objects = AnnotationManager()
     
+    def __str__(self):
+        return str(self.annotation_guid)+":"+self.current_revision.title
+        
     @property
     def awaiting_revisions_count(self):
         return self.revisions.filter(state=AnnotationRevision.AWAITING).distinct().count()
@@ -334,6 +353,9 @@
     state = models.IntegerField(choices=REVISION_STATES, default=AWAITING)
     created = models.DateTimeField(auto_now_add=True, null=True)
 
+    def __str__(self):
+        return str(self.revision_guid)+":"+self.title
+
     def set_tags(self, tags_json_string):
         try:
             tags_dict = json.loads(tags_json_string)
@@ -442,6 +464,9 @@
     
     objects = XtdComment.objects
     
+    def __str__(self):
+        return self.id
+    
     class Meta:
         ordering = ["thread_id", "id"]
     
@@ -470,13 +495,15 @@
     triggers_notifications = models.IntegerField(choices=NOTIFIED_USERS, default=NONE)
     
     def __str__(self):
-        return self.label
+        return self.label+":from:"+self.collection.name
     
 
 class MetaCategoryInfo(models.Model):
     comment = models.ForeignKey('IconolabComment', on_delete=models.CASCADE)
     metacategory = models.ForeignKey('MetaCategory', on_delete=models.CASCADE)
-
+    
+    def __str__(self):
+        return "metacategory:"+self.metacategory.label+":on:"+self.comment.id
 
 class CommentAttachement(models.Model):
      
@@ -494,5 +521,8 @@
     data = models.TextField(blank=False)
     
 class UserProfile(models.Model):
-    user = models.ForeignKey(User, related_name='user', on_delete=models.CASCADE)
-    administers_collection = models.ForeignKey('Collection', related_name='collection', blank=True, null=True)
\ No newline at end of file
+    user = models.OneToOneField(User, related_name='profile', on_delete=models.CASCADE)
+    administers_collection = models.ForeignKey('Collection', related_name='collection', blank=True, null=True)
+    
+    def __str__(self):
+        return "profile:"+self.user.username
\ No newline at end of file
--- a/src/iconolab/templates/iconolab/user_home.html	Tue Aug 16 17:02:57 2016 +0200
+++ b/src/iconolab/templates/iconolab/user_home.html	Wed Aug 17 14:38:22 2016 +0200
@@ -9,8 +9,8 @@
 {% load notifications_tags %}
 
 {% block content %}
-  <div id="user-profile-block" class="row" style="border: 1px solid gray;">
-    <div class="col-md-12">
+  <div class="row" style="border: 1px solid gray;">
+    <div class="col-md-12 user-profile-block" >
       
       <h3>{% if profile_user == request.user %}Mon espace:{% else %}Profil: {% endif %} {{profile_user.username}}</h3>
       <div class="panel panel-default" style="padding-left: 10px; padding-right: 10px;">
@@ -108,7 +108,22 @@
         </div>
       </div>
     </div>
+    {% if profile_user == request.user and profile_user.profile.administers_collection %}
+    <div class="col-md-12">
+      <div class="panel panel-default" style="padding: 10px;">
+      
+        <div class="alert alert-warning">
+          L'accès à ces fonctionnalités n'est pas encore disponible.
+        </div>
+        <h3><small>Administration Fond</small> {{user.profile.administers_collection.verbose_name}}</h3>
+        <div class="text-center">
+          <a href="#" class="btn btn-default disabled text-center">Tableau de bord</a>
+        </div>
+      </div>
+    </div>
+    {% endif %}
   </div>
+
 {% endblock %}
 
 {% block footer_js %}