src/iconolab/models.py
author durandn
Thu, 07 Jul 2016 16:34:31 +0200
changeset 62 8702ab13783e
parent 58 9f7e484baf73
child 64 4d1e369e85d4
permissions -rw-r--r--
design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24
6b6b183447a2 work on models + auth register/login system + adapted existing app and templates so editing annotations is working as before + created empty templates to fill
durandn
parents: 13
diff changeset
     1
from django.db import models, transaction
33
f9d4c9a63e4e Backend work on tags (needs testing) + model changes (image_guid, Tag)
durandn
parents: 30
diff changeset
     2
from django.conf import settings
6
37baf9d13f32 first commit
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
     3
from django.contrib.auth.models import User
37baf9d13f32 first commit
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
     4
from django.contrib.contenttypes.fields import GenericForeignKey
37baf9d13f32 first commit
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
     5
from django.contrib.contenttypes.models import ContentType
37
aed809b3a075 Corrected Tag methods bugs + Added comment classes and migration
durandn
parents: 35
diff changeset
     6
from django_comments_xtd.models import XtdComment
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
     7
from django.utils.text import slugify
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
     8
import uuid, json, re, requests, urllib
6
37baf9d13f32 first commit
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
     9
37baf9d13f32 first commit
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    10
37baf9d13f32 first commit
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    11
class Tag(models.Model):
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    12
    label = models.SlugField(blank=True, null=True)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    13
    link = models.URLField(unique=True)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    14
    description = models.CharField(max_length=255, blank=True, null=True)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    15
    collection = models.ForeignKey('Collection', blank=True, null=True)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    16
    
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    17
    def is_internal(self):
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    18
        return self.link.startswith(settings.INTERNAL_TAGS_URL)
37
aed809b3a075 Corrected Tag methods bugs + Added comment classes and migration
durandn
parents: 35
diff changeset
    19
6
37baf9d13f32 first commit
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    20
24
6b6b183447a2 work on models + auth register/login system + adapted existing app and templates so editing annotations is working as before + created empty templates to fill
durandn
parents: 13
diff changeset
    21
class TaggingInfo(models.Model):
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    22
    revision = models.ForeignKey('AnnotationRevision', on_delete=models.CASCADE)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    23
    tag = models.ForeignKey('Tag', on_delete=models.CASCADE)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    24
    accuracy = models.IntegerField()
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    25
    relevancy = models.IntegerField()
6
37baf9d13f32 first commit
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    26
37
aed809b3a075 Corrected Tag methods bugs + Added comment classes and migration
durandn
parents: 35
diff changeset
    27
6
37baf9d13f32 first commit
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    28
class Collection(models.Model):
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    29
    name =    models.CharField(max_length=50, unique=True)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    30
    description = models.CharField(max_length=255)
6
37baf9d13f32 first commit
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    31
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    32
    def __str__(self):
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    33
        return self.name
6
37baf9d13f32 first commit
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    34
24
6b6b183447a2 work on models + auth register/login system + adapted existing app and templates so editing annotations is working as before + created empty templates to fill
durandn
parents: 13
diff changeset
    35
31
e34b70a00488 adding annotations list
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 30
diff changeset
    36
class Item(models.Model):
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    37
    collection = models.ForeignKey(Collection, related_name="items")
37
aed809b3a075 Corrected Tag methods bugs + Added comment classes and migration
durandn
parents: 35
diff changeset
    38
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    39
    
24
6b6b183447a2 work on models + auth register/login system + adapted existing app and templates so editing annotations is working as before + created empty templates to fill
durandn
parents: 13
diff changeset
    40
class ItemMetadata(models.Model):
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    41
    item = models.OneToOneField('Item', related_name='metadatas')
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    42
    joconde_ref = models.CharField(max_length=20, null=False, blank=False, unique=True)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    43
    domain = models.CharField(max_length=255)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    44
    title = models.CharField(max_length=255)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    45
    description = models.CharField(max_length=255)
24
6b6b183447a2 work on models + auth register/login system + adapted existing app and templates so editing annotations is working as before + created empty templates to fill
durandn
parents: 13
diff changeset
    46
31
e34b70a00488 adding annotations list
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 30
diff changeset
    47
24
6b6b183447a2 work on models + auth register/login system + adapted existing app and templates so editing annotations is working as before + created empty templates to fill
durandn
parents: 13
diff changeset
    48
class ImageStats(models.Model):
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    49
    image = models.OneToOneField('Image', related_name='stats', blank=False, null=False)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    50
    views_count = models.IntegerField(blank=True, null=True, default=0)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    51
    annotations_count = models.IntegerField(blank=True, null=True, default=0)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    52
    submitted_revisions_count = models.IntegerField(blank=True, null=True, default=0)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    53
    comments_count = models.IntegerField(blank=True, null=True, default=0)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    54
    folders_inclusion_count = models.IntegerField(blank=True, null=True, default=0)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    55
    tag_count = models.IntegerField(blank=True, null=True, default=0)
24
6b6b183447a2 work on models + auth register/login system + adapted existing app and templates so editing annotations is working as before + created empty templates to fill
durandn
parents: 13
diff changeset
    56
6
37baf9d13f32 first commit
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    57
class Image(models.Model):
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    58
    image_guid = models.UUIDField(default=uuid.uuid4, editable=False)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    59
    name = models.CharField(max_length=200)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    60
    media = models.ImageField(upload_to='uploads/', height_field='height', width_field='width')
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    61
    item = models.ForeignKey('Item', related_name='images', null=True, blank=True)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    62
    height = models.IntegerField(null=False, blank=False)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    63
    width = models.IntegerField(null=False, blank=False)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    64
    created = models.DateTimeField(auto_now_add=True, null=True)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    65
    
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    66
    def __str__(self):
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    67
        return self.name
6
37baf9d13f32 first commit
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    68
24
6b6b183447a2 work on models + auth register/login system + adapted existing app and templates so editing annotations is working as before + created empty templates to fill
durandn
parents: 13
diff changeset
    69
# # Folders
6b6b183447a2 work on models + auth register/login system + adapted existing app and templates so editing annotations is working as before + created empty templates to fill
durandn
parents: 13
diff changeset
    70
# class Folder(models.Model):
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    71
#     label = models.CharField(max_length=255)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    72
#     owner = models.ForeignKey(User)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    73
#     images = models.ManyToManyField(Image)
24
6b6b183447a2 work on models + auth register/login system + adapted existing app and templates so editing annotations is working as before + created empty templates to fill
durandn
parents: 13
diff changeset
    74
# 
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    75
#     def __str__(self):
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    76
#         return label
24
6b6b183447a2 work on models + auth register/login system + adapted existing app and templates so editing annotations is working as before + created empty templates to fill
durandn
parents: 13
diff changeset
    77
6b6b183447a2 work on models + auth register/login system + adapted existing app and templates so editing annotations is working as before + created empty templates to fill
durandn
parents: 13
diff changeset
    78
class AnnotationManager(models.Manager):
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    79
    
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    80
    # Call Annotation.objects.create_annotation to initialize a new Annotation with its associated AnnotationStats and initial AnnotationRevision
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    81
    @transaction.atomic
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    82
    def create_annotation(self, author, image, title='', description='', fragment='', tags_json='[]'):
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    83
        # Create annotation object
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    84
        new_annotation = Annotation(
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    85
            image=image, 
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    86
            author=author
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    87
        )
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    88
        new_annotation.save()
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    89
        
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    90
        # Create initial revision
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    91
        initial_revision = AnnotationRevision(
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    92
            annotation=new_annotation, 
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    93
            author=author,
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    94
            title=title,
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    95
            description=description,
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    96
            fragment=fragment,
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    97
            state=AnnotationRevision.ACCEPTED
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    98
        )
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
    99
        initial_revision.save()
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   100
        initial_revision.set_tags(tags_json)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   101
        
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   102
        new_annotation.current_revision = initial_revision
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   103
        new_annotation.save()
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   104
        
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   105
        # Create stats object
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   106
        new_annotation_stats = AnnotationStats(annotation=new_annotation)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   107
        new_annotation_stats.save()
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   108
        new_annotation.stats = new_annotation_stats
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   109
        new_annotation.save()
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   110
        return new_annotation
24
6b6b183447a2 work on models + auth register/login system + adapted existing app and templates so editing annotations is working as before + created empty templates to fill
durandn
parents: 13
diff changeset
   111
6b6b183447a2 work on models + auth register/login system + adapted existing app and templates so editing annotations is working as before + created empty templates to fill
durandn
parents: 13
diff changeset
   112
class AnnotationStats(models.Model):
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   113
    annotation = models.OneToOneField('Annotation', related_name='stats', blank=False, null=False)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   114
    submitted_revisions_count = models.IntegerField(blank=True, null=True, default=1)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   115
    accepted_revisions_count = models.IntegerField(blank=True, null=True, default=1)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   116
    contributors_count = models.IntegerField(blank=True, null=True, default=1)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   117
    views_count = models.IntegerField(blank=True, null=True, default=0)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   118
    comments_count = models.IntegerField(blank=True, null=True, default=0)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   119
    tag_count = models.IntegerField(blank=True, null=True, default=0)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   120
    
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   121
    def contributors(self):
62
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   122
        contributors = []
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   123
        for revision in self.annotation.revisions.filter(state__in=[AnnotationRevision.ACCEPTED, AnnotationRevision.STUDIED]):
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   124
            if revision.author not in contributors:
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   125
                contributors.append(revision.author)
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   126
        print(contributors)
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   127
        return contributors
24
6b6b183447a2 work on models + auth register/login system + adapted existing app and templates so editing annotations is working as before + created empty templates to fill
durandn
parents: 13
diff changeset
   128
6
37baf9d13f32 first commit
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
   129
24
6b6b183447a2 work on models + auth register/login system + adapted existing app and templates so editing annotations is working as before + created empty templates to fill
durandn
parents: 13
diff changeset
   130
class Annotation(models.Model):
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   131
    annotation_guid = models.UUIDField(default=uuid.uuid4, editable=False)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   132
    image = models.ForeignKey('Image', related_name='annotations', on_delete=models.CASCADE)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   133
    source_revision = models.ForeignKey('AnnotationRevision', related_name='source_related_annotation', blank=True, null=True)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   134
    current_revision = models.OneToOneField('AnnotationRevision', related_name='current_for_annotation', blank=True, null=True)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   135
    author = models.ForeignKey(User, null=True)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   136
    created = models.DateTimeField(auto_now_add=True, null=True)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   137
    
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   138
    objects = AnnotationManager()
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   139
    
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   140
    def update_stats(self):
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   141
        pass
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   142
    
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   143
    # Call to create a new revision, possibly from a merge
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   144
    @transaction.atomic
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   145
    def make_new_revision(self, author, title, description, fragment, tags_json):
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   146
        if author == self.author:
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   147
            # We're creating an automatically accepted revision
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   148
            new_revision_state = AnnotationRevision.ACCEPTED
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   149
        else:
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   150
            # Revision will require validation
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   151
            new_revision_state = AnnotationRevision.AWAITING
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   152
        new_revision = AnnotationRevision(
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   153
            annotation = self,
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   154
            parent_revision=self.current_revision,
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   155
            title=title,
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   156
            description=description,
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   157
            author=author,
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   158
            fragment=fragment,
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   159
            state=new_revision_state
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   160
        )
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   161
        new_revision.save()
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   162
        new_revision.set_tags(tags_json)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   163
        if new_revision.state == AnnotationRevision.ACCEPTED:
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   164
            self.current_revision = new_revision
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   165
            self.save()
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   166
        return new_revision
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   167
    
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   168
    # Call when we're validating an awaiting revision whose parent is the current revision AS IT WAS CREATED
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   169
    @transaction.atomic
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   170
    def validate_existing_revision(self, revision_to_validate):
62
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   171
        if revision_to_validate.parent_revision == self.current_revision and revision_to_validate.state == AnnotationRevision.AWAITING:
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   172
            self.current_revision = revision_to_validate
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   173
            revision_to_validate.state = AnnotationRevision.ACCEPTED
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   174
            revision_to_validate.save()
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   175
            self.save()
62
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   176
    
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   177
    # Call to reject a 
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   178
    @transaction.atomic
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   179
    def reject_existing_revision(self, revision_to_reject):
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   180
        if revision_to_reject.state == AnnotationRevision.AWAITING:
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   181
            revision_to_reject.state = AnnotationRevision.REJECTED
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   182
            revision_to_reject.save()
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   183
        
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   184
    # Call when we're validating an awaiting revision whose parent isn't the current revision OR IF IT WAS CHANGED BY THE ANNOTATION AUTHOR
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   185
    @transaction.atomic
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   186
    def merge_existing_revision(self, title, description, fragment, tags, revision_to_merge):
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   187
        merged_revision = self.make_new_revision(author=self.author, title=title, description=description, fragment=fragment, tags=tags)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   188
        merged_revision.merge_parent_revision = revision_to_merge
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   189
        merged_revision.save()
62
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   190
        revision_to_merge.state = AnnotationRevision.STUDIED
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   191
        revision_to_merge.save()
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   192
        self.current_revision=merged_revision
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   193
        self.save()
6
37baf9d13f32 first commit
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
   194
37
aed809b3a075 Corrected Tag methods bugs + Added comment classes and migration
durandn
parents: 35
diff changeset
   195
24
6b6b183447a2 work on models + auth register/login system + adapted existing app and templates so editing annotations is working as before + created empty templates to fill
durandn
parents: 13
diff changeset
   196
class AnnotationRevision(models.Model):
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   197
    
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   198
    AWAITING = 0
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   199
    ACCEPTED = 1
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   200
    REJECTED = 2
62
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   201
    STUDIED = 3
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   202
    
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   203
    REVISION_STATES = (
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   204
        (AWAITING, 'awaiting'),
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   205
        (ACCEPTED, 'accepted'),
62
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   206
        (REJECTED, 'rejected'),
8702ab13783e design work on templates, redirect to home on /, implemented accept and reject revisions shortcuts when applicable
durandn
parents: 58
diff changeset
   207
        (STUDIED, 'studied'),
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   208
    )
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   209
    
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   210
    revision_guid = models.UUIDField(default=uuid.uuid4)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   211
    annotation = models.ForeignKey('Annotation', related_name='revisions', null=False, blank=False)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   212
    parent_revision = models.ForeignKey('AnnotationRevision', related_name='child_revisions', blank=True, null=True)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   213
    merge_parent_revision = models.ForeignKey('AnnotationRevision', related_name='child_revisions_merge', blank=True, null=True)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   214
    author = models.ForeignKey(User, null=True)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   215
    title = models.CharField(max_length=255)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   216
    description = models.TextField(null=True)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   217
    fragment = models.TextField()
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   218
    tags = models.ManyToManyField('Tag', through='TaggingInfo', through_fields=('revision', 'tag'))
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   219
    state = models.IntegerField(choices=REVISION_STATES, default=AWAITING)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   220
    created = models.DateTimeField(auto_now_add=True, null=True)
6
37baf9d13f32 first commit
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
   221
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   222
    def set_tags(self, tags_json_string):
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   223
        try:
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   224
            tags_dict = json.loads(tags_json_string)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   225
        except ValueError:
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   226
            pass
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   227
        for tag_data in tags_dict:
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   228
            tag_string = tag_data.get("tag_input")
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   229
            tag_accuracy = tag_data.get("accuracy", 0)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   230
            tag_relevancy = tag_data.get("relevancy", 0)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   231
            
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   232
            if tag_string.startswith("http://") or tag_string.startswith("https://"): #check if url
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   233
                if Tag.objects.filter(link=tag_string).exists(): #check if tag already exists
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   234
                    tag_obj = Tag.objects.get(link=tag_string)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   235
                else:
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   236
                    tag_obj = Tag.objects.create(
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   237
                        link = tag_string,
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   238
                    )
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   239
            else:
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   240
                new_tag_link = settings.BASE_URL+'/'+slugify(tag_string)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   241
                if Tag.objects.filter(link=new_tag_link).exists():
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   242
                    # Somehow we received a label for an existing tag
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   243
                    tag_obj = Tag.objects.get(link=new_tag_link)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   244
                else:
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   245
                    tag_obj = Tag.objects.create(
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   246
                        label = tag_string,
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   247
                        description = "",
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   248
                        link = settings.INTERNAL_TAGS_URL+'/'+slugify(tag_string),
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   249
                        collection = self.annotation.image.item.collection
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   250
                    )
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   251
            tag_info = TaggingInfo.objects.create(
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   252
                tag=tag_obj, 
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   253
                revision=self,
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   254
                accuracy = tag_accuracy,
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   255
                relevancy = tag_relevancy
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   256
            )
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   257
        
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   258
    def get_tags_json(self):
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   259
        
54
147c8a8b66b6 streamlined templates for easy navigation and missing info + handled fr.dbpedia tags
durandn
parents: 53
diff changeset
   260
        def fetch_from_dbpedia(uri, lang, source):
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   261
            sparql_template = 'select distinct * where { <<%uri%>> rdfs:label ?l FILTER( langMatches( lang(?l), "<%lang%>" ) ) }' 
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   262
            sparql_query = re.sub("<%uri%>", uri, re.sub("<%lang%>", lang, sparql_template))
54
147c8a8b66b6 streamlined templates for easy navigation and missing info + handled fr.dbpedia tags
durandn
parents: 53
diff changeset
   263
            sparql_query_url = source+'sparql'
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   264
            dbpedia_resp = requests.get(
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   265
                sparql_query_url, 
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   266
                params={
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   267
                        "query": sparql_query,
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   268
                        "format": "json"
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   269
                }
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   270
            )
49
52ec8e085013 work on extracting label from dbpedia
durandn
parents: 48
diff changeset
   271
            results = json.loads(dbpedia_resp.text).get("results", {})
52ec8e085013 work on extracting label from dbpedia
durandn
parents: 48
diff changeset
   272
            variable_bindings = results.get("bindings")
58
9f7e484baf73 Error handling in models + templates fixes
durandn
parents: 54
diff changeset
   273
            if variable_bindings:
9f7e484baf73 Error handling in models + templates fixes
durandn
parents: 54
diff changeset
   274
                label_json = variable_bindings.pop()
9f7e484baf73 Error handling in models + templates fixes
durandn
parents: 54
diff changeset
   275
            else:
9f7e484baf73 Error handling in models + templates fixes
durandn
parents: 54
diff changeset
   276
                label_json = {"l": {"value": "ERROR_LABEL"}}
49
52ec8e085013 work on extracting label from dbpedia
durandn
parents: 48
diff changeset
   277
            return label_json.get("l").get("value")
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   278
        
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   279
        final_list = []
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   280
        for tagging_info in self.tagginginfo_set.select_related("tag").all():
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   281
            if tagging_info.tag.is_internal():
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   282
                final_list.append({
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   283
                    "tag_label": tagging_info.tag.label,
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   284
                    "tag_link": tagging_info.tag.link,
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   285
                    "accuracy": tagging_info.accuracy,
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   286
                    "relevancy": tagging_info.relevancy
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   287
                })
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   288
            else:
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   289
                tag_link = tagging_info.tag.link
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   290
                #import label from external
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   291
                externaL_repos_fetch_dict = {
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   292
                    "http://dbpedia.org/": fetch_from_dbpedia,
53
ed9acfa5dd6e collection home page + tags in revision_detail view + optimization in views + fixture for demo
durandn
parents: 49
diff changeset
   293
                    "http://fr.dbpedia.org/": fetch_from_dbpedia
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   294
                }
53
ed9acfa5dd6e collection home page + tags in revision_detail view + optimization in views + fixture for demo
durandn
parents: 49
diff changeset
   295
                try:
54
147c8a8b66b6 streamlined templates for easy navigation and missing info + handled fr.dbpedia tags
durandn
parents: 53
diff changeset
   296
                    (source, fetch_label) = next(item for item in externaL_repos_fetch_dict.items() if tag_link.startswith(item[0]))
147c8a8b66b6 streamlined templates for easy navigation and missing info + handled fr.dbpedia tags
durandn
parents: 53
diff changeset
   297
                    tag_label = fetch_label(tag_link, "fr", source)
53
ed9acfa5dd6e collection home page + tags in revision_detail view + optimization in views + fixture for demo
durandn
parents: 49
diff changeset
   298
                    final_list.append({
ed9acfa5dd6e collection home page + tags in revision_detail view + optimization in views + fixture for demo
durandn
parents: 49
diff changeset
   299
                        "tag_label": tag_label,
ed9acfa5dd6e collection home page + tags in revision_detail view + optimization in views + fixture for demo
durandn
parents: 49
diff changeset
   300
                        "tag_link": tag_link,
ed9acfa5dd6e collection home page + tags in revision_detail view + optimization in views + fixture for demo
durandn
parents: 49
diff changeset
   301
                        "accuracy": tagging_info.accuracy,
ed9acfa5dd6e collection home page + tags in revision_detail view + optimization in views + fixture for demo
durandn
parents: 49
diff changeset
   302
                        "relevancy": tagging_info.relevancy
ed9acfa5dd6e collection home page + tags in revision_detail view + optimization in views + fixture for demo
durandn
parents: 49
diff changeset
   303
                    })
ed9acfa5dd6e collection home page + tags in revision_detail view + optimization in views + fixture for demo
durandn
parents: 49
diff changeset
   304
                except StopIteration:
ed9acfa5dd6e collection home page + tags in revision_detail view + optimization in views + fixture for demo
durandn
parents: 49
diff changeset
   305
                    pass
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   306
        return json.dumps(final_list) 
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   307
    
37
aed809b3a075 Corrected Tag methods bugs + Added comment classes and migration
durandn
parents: 35
diff changeset
   308
class IconolabComment(XtdComment):
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   309
    revision = models.ForeignKey('AnnotationRevision', related_name='creation_comment', null=True, blank=True)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   310
    metacategories = models.ManyToManyField('MetaCategory', through='MetaCategoryInfo', through_fields=('comment', 'metacategory'))
37
aed809b3a075 Corrected Tag methods bugs + Added comment classes and migration
durandn
parents: 35
diff changeset
   311
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   312
    
37
aed809b3a075 Corrected Tag methods bugs + Added comment classes and migration
durandn
parents: 35
diff changeset
   313
class MetaCategory(models.Model):
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   314
    collection = models.ForeignKey(Collection)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   315
    label = models.CharField(max_length=255)
37
aed809b3a075 Corrected Tag methods bugs + Added comment classes and migration
durandn
parents: 35
diff changeset
   316
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   317
    def __str__(self):
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   318
        return self.label
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   319
    
37
aed809b3a075 Corrected Tag methods bugs + Added comment classes and migration
durandn
parents: 35
diff changeset
   320
aed809b3a075 Corrected Tag methods bugs + Added comment classes and migration
durandn
parents: 35
diff changeset
   321
class MetaCategoryInfo(models.Model):
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   322
    comment = models.ForeignKey('IconolabComment', on_delete=models.CASCADE)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   323
    metacategory = models.ForeignKey('MetaCategory', on_delete=models.CASCADE)
37
aed809b3a075 Corrected Tag methods bugs + Added comment classes and migration
durandn
parents: 35
diff changeset
   324
6
37baf9d13f32 first commit
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
   325
37
aed809b3a075 Corrected Tag methods bugs + Added comment classes and migration
durandn
parents: 35
diff changeset
   326
class CommentAttachement(models.Model):
48
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   327
     
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   328
    LINK = 0
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   329
    IMAGE = 1
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   330
    PDF = 2
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   331
    COMMENT_CHOICES = (
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   332
        (LINK, 'link'),
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   333
        (IMAGE, 'image'),
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   334
        (PDF, 'pdf')
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   335
    )
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   336
    
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   337
    comment = models.ForeignKey('IconolabComment', related_name='attachments', on_delete=models.CASCADE)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   338
    attachment_type = models.IntegerField(choices=COMMENT_CHOICES, default=0)
8125ce36415c start on dbpedia requests
durandn
parents: 47
diff changeset
   339
    data = models.TextField(blank=False)