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