src/iconolab/models.py
changeset 6 37baf9d13f32
child 13 99224989b67b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/iconolab/models.py	Tue May 31 17:46:32 2016 +0200
@@ -0,0 +1,157 @@
+from django.db import models
+from django.contrib.auth.models import User
+
+from django.contrib.contenttypes.fields import GenericForeignKey
+from django.contrib.contenttypes.models import ContentType
+from reversion import revisions as reversion
+from reversion.models import Revision
+
+
+class Tag(models.Model):
+	label = models.SlugField()
+	link = models.URLField()
+	description = models.TextField()
+
+	def __str__(self):
+		return '%d:%s' % (self.id, self.label)
+
+
+# fonds Ingres - Musée de la Poste 
+class Collection(models.Model):
+	name =	models.CharField(max_length=50)
+	description = models.CharField(max_length=255)
+
+	def __str__(self):
+		return self.name
+
+# class image_metadata
+class Image(models.Model):
+	name = models.CharField(max_length=200)
+	media = models.ImageField(upload_to='uploads/', height_field='height', width_field='width')
+	height = models.IntegerField(null=False, blank=False)
+	width = models.IntegerField(null=False, blank=False)
+	mimetype = models.CharField(null=True, blank=True, max_length=1024)
+	exif = models.TextField(null=True, blank=True) 
+	collection = models.ForeignKey(Collection)
+	date_created = models.DateTimeField(auto_now_add=True, null=True)
+	date_modified = models.DateTimeField(auto_now=True, null=True)
+	
+	def __str__(self):
+		return self.name
+
+# Folders
+class Folder(models.Model):
+	label = models.CharField(max_length=255)
+	owner = models.ForeignKey(User)
+	images = models.ManyToManyField(Image)
+
+	def __str__(self):
+		return label
+
+@reversion.register()
+class Annotation(models.Model):
+	title = models.CharField(max_length=255)
+	description = models.TextField(null=True)
+	fragment = models.TextField() # path string
+	tags = models.ManyToManyField(Tag)
+	image = models.ForeignKey(Image, default=0, on_delete=models.CASCADE)
+	author = models.ForeignKey(User, null=True)
+	date_created = models.DateTimeField(auto_now_add=True, null=True)
+	date_modified = models.DateTimeField(auto_now=True, null=True)
+
+	def __str__(self):
+		return self.title
+
+# comments
+
+LINK = 1
+IMAGE = 2
+PDF = 3
+
+COMMENT_CHOICES = (
+	(LINK, 'link'),
+	(IMAGE, 'image'),
+	(PDF, 'pdf')
+	)
+
+
+class MetaCategory(models.Model):
+	collection = models.ForeignKey(Collection)
+	label = models.CharField(max_length=200)
+
+	def __str__(self):
+		return self.label
+
+	class Meta:
+		verbose_name_plural = "Metacategories"
+
+class Comment(models.Model):
+	author =  models.ForeignKey(User)
+	created_date = models.DateTimeField(blank=False, null=False, auto_now_add=True)
+	annotation = models.ForeignKey(Annotation, null=True) # revision de l'utilisateur?
+	target = models.ForeignKey("self") #
+	#thread_id #django-contrib-comment #threadedcomment
+	content = models.TextField(blank=True)
+	metacategories = models.ManyToManyField(MetaCategory) 
+
+
+class CommentAttachement(models.Model):
+	comment = models.ForeignKey(Comment, on_delete=models.CASCADE, related_name='attachments')
+	main_annotation = models.ForeignKey(Annotation)
+	attachment_type = models.IntegerField(choices=COMMENT_CHOICES, default=1)
+	created_date = models.DateTimeField(auto_now_add=True)
+	data = models.TextField(blank=False)
+
+
+# Activity & Notification
+
+class Activity(models.Model):
+
+	NEW_COMMENT = 1
+	NEW_REVISION = 2
+	NEW_REVISION_COMMENT = 3
+	NEW_EXPERT_ANSWER = 4
+	NEW_REFERENCE = 5
+	EXPERT_CALL = 6
+
+	ACTIVITY_VERBS =(
+		(NEW_COMMENT, 'Nouveau commentaire'),
+		(NEW_REVISION, 'Nouvelle révision'),
+		(NEW_REVISION_COMMENT, 'Nouveau commentaire de révision'),
+		(NEW_EXPERT_ANSWER, 'New expert ans')
+		) 
+
+	verb = models.IntegerField(choices=ACTIVITY_VERBS)
+	actor = models.ForeignKey(User)
+
+	target_content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
+	target_object_id = models.PositiveIntegerField()
+	target = GenericForeignKey('target_content_type', 'target_object_id')
+
+	action_content_type = models.ForeignKey(ContentType, related_name='activity_action', on_delete=models.CASCADE, null=True, blank=True)
+	action_object_id = models.PositiveIntegerField(null=True, blank=True)
+	action_content = GenericForeignKey('action_content_type', 'action_object_id') 
+	
+	created_date = models.DateTimeField(auto_now_add=True)
+
+	def __str__(self):
+		return '%s:%s' % (author.name, verbe)
+
+
+class Notification(models.Model):
+
+	UNREAD = 0
+	READ = 1
+	DELETED = 2
+
+	STATUS = (
+		(READ, 'Lu'),
+		(UNREAD, 'Non lu'),
+		(DELETED, 'Effacé')
+		)
+
+	activity = models.ForeignKey(Activity)
+	user = models.ForeignKey(User)
+	status = models.IntegerField(choices=STATUS, default=UNREAD)
+	created_date = models.DateTimeField(auto_now_add=True)
+