src/hdabo/models.py
changeset 271 8f77cf71ab02
parent 200 23b2b36e5118
child 272 1c774f7a0341
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hdabo/models.py	Tue Jun 17 10:25:33 2014 +0200
@@ -0,0 +1,404 @@
+# -*- coding: utf-8 -*-
+
+from django.conf import settings
+from django.contrib.auth.models import User
+from django.db import models
+from hdabo.utils import Property, normalize
+import datetime
+
+
+
+class SortedModelManager(models.Manager):
+    use_for_related_fields = True
+    def get_query_set(self):
+        qs = super(SortedModelManager, self).get_query_set()
+        if getattr(self, 'through', None) is not None and getattr(self.through, 'Meta', None) is not None and getattr(self.through.Meta, 'ordering', None) is not None:
+            qs = qs.order_by(*[self.through._meta.db_table + "." + f for f in self.through.Meta.ordering])
+        return qs
+
+
+class Organisation(models.Model):
+    hda_id = models.CharField(max_length=512, unique=True, blank=False, null=False)
+    name = models.CharField(max_length=512, unique=False, blank=False, null=False)
+    location = models.CharField(max_length=512, unique=False, blank=True, null=True)
+    website = models.CharField(max_length=2048, unique=False, blank=True, null=True)
+    
+class Author(models.Model):
+    hda_id = models.CharField(max_length=512, unique=True, blank=False, null=False)
+    lastname = models.CharField(max_length=512, unique=False, blank=True, null=True)
+    firstname = models.CharField(max_length=512, unique=False, blank=True, null=True)
+
+class TimePeriod(models.Model):
+    TIME_PERIOD_CHOICES = (
+        (1, u'Primaire'),
+        (2, u'Collège'),
+        (3, u'Lycée'),
+    )
+    TIME_PERIOD_DICT = {
+        u'Primaire': 1,
+        u'Collège': 2,
+        u'Lycée': 3,
+    }
+    label = models.CharField(max_length=512, unique=False, blank=False, null=False)
+    school_period = models.IntegerField(choices=TIME_PERIOD_CHOICES)
+    
+    objects = SortedModelManager()
+    
+    class Meta:
+        unique_together = ("label", "school_period")
+
+    def __unicode__(self):
+        return unicode(self.label)
+
+class Domain(models.Model):
+    DOMAIN_PERIOD_CHOICES = (
+        (0, u'Global'),
+        (1, u'Primaire'),
+        (2, u'Collège'),
+        (3, u'Lycée'),
+    )
+    DOMAIN_PERIOD_DICT = {
+        u'Global': 0,
+        u'Primaire': 1,
+        u'Collège': 2,
+        u'Lycée': 3,
+    }
+    label = models.CharField(max_length=512, unique=False, blank=False, null=False)
+    school_period = models.IntegerField(choices=DOMAIN_PERIOD_CHOICES)
+
+    objects = SortedModelManager()
+
+    class Meta:
+        unique_together = ("label", "school_period")
+
+    def __unicode__(self):
+        return unicode(self.label)
+
+
+class DocumentFormat(models.Model):
+    label = models.CharField(max_length=512, unique=True, blank=False, null=False)
+
+    def __unicode__(self):
+        return unicode(self.label)
+    
+class TagCategory(models.Model):
+    label = models.CharField(max_length=512, unique=True, blank=False, null=False)
+    
+    def __unicode__(self):
+        return unicode(self.label)
+    
+    class Meta:
+        verbose_name_plural = "TagCategories"
+
+class Tag(models.Model):
+    TAG_URL_STATUS_CHOICES = (
+        (0, "null_result"),
+        (1, "redirection"),
+        (2, "homonyme"),
+        (3, "match"),
+        (4, "unsematized"),
+    )
+    
+    TAG_URL_STATUS_DICT = {
+        "null_result":0,
+        "redirection":1,
+        "homonyme":2,
+        "match":3,
+        "unsemantized":4,
+    }
+    
+    label = models.CharField(max_length=1024, unique=False, blank=False, null=False, db_index=True)
+    alternative_label = models.CharField(max_length=1024, unique=False, blank=True, null=True)
+    normalized_label = models.CharField(max_length=1024, unique=False, blank=False, null=False, db_index=True, editable=False)
+    created_at = models.DateTimeField(auto_now_add=True)
+    original_label = models.CharField(max_length=1024, unique=False, blank=False, null=False, editable=False)
+    alias = models.CharField(max_length=1024, unique=False, blank=True, null=True)
+    category = models.ForeignKey(TagCategory, null=True, blank=True)
+    wikipedia_url = models.URLField(max_length=2048, blank=True, null=True, db_index=True)
+    wikipedia_pageid = models.BigIntegerField(unique=False, blank=True, null=True, db_index=True)
+    alternative_wikipedia_url = models.URLField(max_length=2048, blank=True, null=True, db_index=True)
+    alternative_wikipedia_pageid = models.BigIntegerField(unique=False, blank=True, null=True, db_index=True)
+    url_status = models.IntegerField(choices=TAG_URL_STATUS_CHOICES, blank=True, null=True, default=None, db_index=True)
+    dbpedia_uri = models.URLField(max_length=2048, blank=True, null=True, db_index=True)
+    popularity = models.IntegerField(blank=False, null=False, default=0, db_index=True)
+
+    @Property
+    def url_status_text(): #@NoSelf
+        def fget(self):
+            return self.TAG_URL_STATUS_CHOICES[self.url_status][1]
+        
+        return locals()
+    
+    def save(self, *args, **kwargs):
+        self.normalized_label = normalize(self.label)
+        super(Tag, self).save(*args, **kwargs) 
+            
+    class Meta:
+        unique_together = (('label', 'original_label', 'url_status'),)
+        
+class Location(models.Model):
+    name = models.CharField(max_length=512, unique=False, blank=False, null=False)
+    insee = models.CharField(max_length=5, unique=True, blank=False, null=False)
+
+    def __unicode__(self):
+        return unicode("%s : %s" % (self.name, self.insee))
+
+
+def generate_m2m_setter(m2m_field_name):
+    
+    def set_m2m_field(self, list):
+        
+        m2m_manager = getattr(self, m2m_field_name)
+        m2m_manager.clear()
+        
+        through_klass = set_m2m_field.cache.get('through_klass', None)
+        if through_klass is None:
+            field = getattr(self.__class__, m2m_field_name)
+            through_klass = field.through
+            set_m2m_field.cache['through_klass'] = through_klass
+            for f in through_klass._meta.fields:
+                if isinstance(f, models.ForeignKey) and f.name != "datasheet":
+                    set_m2m_field.cache['target_obj_field_name'] = f.name
+                    break
+        target_obj_field_name = set_m2m_field.cache['target_obj_field_name']
+
+        for i, obj in enumerate(list):
+            kwargs = {
+                'datasheet': self,
+                'sort_value' : i,
+                target_obj_field_name: obj
+            }
+            new_rel = through_klass(**kwargs)
+            new_rel.save()
+    set_m2m_field.cache = {}
+            
+    return set_m2m_field
+
+
+class Datasheet(models.Model):
+    hda_id = models.CharField(max_length=512, unique=True, blank=False, null=False)
+    author = models.ForeignKey(Author, null=True, blank=True, serialize=False)
+    organisation = models.ForeignKey(Organisation, serialize=False, null=True)
+    title = models.CharField(max_length=2048, unique=False, blank=False, null=False, serialize=False)
+    description = models.TextField(blank=True, null=True, serialize=False)
+    url = models.URLField(max_length=2048, blank=True, null=True, serialize=False)
+    domains = models.ManyToManyField(Domain, limit_choices_to={'school_period':Domain.DOMAIN_PERIOD_DICT[u'Global']}, related_name="datasheets", through="Datasheet_domains", serialize=False)
+    primary_periods = models.ManyToManyField(TimePeriod, limit_choices_to={'school_period':TimePeriod.TIME_PERIOD_DICT[u'Primaire']}, related_name="primary_periods_datasheets", through="Datasheet_primary_periods", serialize=False)
+    college_periods = models.ManyToManyField(TimePeriod, limit_choices_to={'school_period':TimePeriod.TIME_PERIOD_DICT[u'Collège']}, related_name="college_periods_datasheets", through="Datasheet_college_periods", serialize=False)
+    highschool_periods = models.ManyToManyField(TimePeriod, limit_choices_to={'school_period':TimePeriod.TIME_PERIOD_DICT[u'Lycée']}, related_name="highschool_periods_datasheets", through="Datasheet_highschool_periods", serialize=False)
+    primary_themes = models.ManyToManyField(Domain, limit_choices_to={'school_period':Domain.DOMAIN_PERIOD_DICT[u'Primaire']}, related_name="primary_themes_datasheets", through="Datasheet_primary_themes", serialize=False)
+    college_themes = models.ManyToManyField(Domain, limit_choices_to={'school_period':Domain.DOMAIN_PERIOD_DICT[u'Collège']}, related_name="college_themes_datasheets", through="Datasheet_college_themes", serialize=False)
+    highschool_themes = models.ManyToManyField(Domain, limit_choices_to={'school_period':Domain.DOMAIN_PERIOD_DICT[u'Lycée']}, related_name="highschool_themes_datasheets", through="Datasheet_highschool_themes", serialize=False)
+    town = models.ForeignKey(Location, null=True, blank=True, serialize=False)
+    format = models.ForeignKey(DocumentFormat, null=True, blank=True, serialize=False)
+    original_creation_date = models.DateField(serialize=False)
+    original_modification_date = models.DateField(serialize=False)
+    modification_datetime = models.DateTimeField(auto_now=True, serialize=False)
+    validation_date = models.DateTimeField(null=True, blank=True, serialize=False)
+    validated = models.BooleanField(default=False, db_index=True)
+    validator = models.ForeignKey(User, null=True, blank=True, serialize=False)
+    manual_order = models.BooleanField(default=False, db_index=True, serialize=False)
+    tags = models.ManyToManyField(Tag, through='TaggedSheet', serialize=False)
+    
+    def natural_key(self):
+        return self.hda_id
+        
+    def validate(self, user):
+        self.validation_date = datetime.datetime.now()
+        self.validated = True
+        self.validator = user
+        self.save()
+    
+    def unvalidate(self):
+        self.validation_date = datetime.datetime.min
+        self.validated = False
+        self.validator = None
+        self.save()
+        
+        
+    set_domains = generate_m2m_setter("domains")
+    
+    @Property
+    def domains_list(): #@NoSelf
+        def fget(self):
+            return [d.label for d in self.domains.all()]
+        
+        return locals() 
+
+    @Property
+    def domains_text(): #@NoSelf
+        def fget(self):
+            return "; ".join(self.domains_list)
+        
+        return locals() 
+
+
+    set_primary_periods = generate_m2m_setter("primary_periods")
+
+    @Property
+    def primary_periods_list(): #@NoSelf
+        def fget(self):
+            return [d.label for d in self.primary_periods.all()] 
+
+        return locals() 
+
+    
+    @Property
+    def primary_periods_text(): #@NoSelf
+        def fget(self):
+            return "; ".join(self.primary_periods_list) 
+
+        return locals() 
+
+    set_college_periods = generate_m2m_setter("college_periods")
+
+    @Property
+    def college_periods_list(): #@NoSelf
+        def fget(self):
+            return [d.label for d in self.college_periods.all()] 
+
+        return locals() 
+
+    @Property
+    def college_periods_text(): #@NoSelf
+        def fget(self):
+            return "; ".join(self.college_periods_list) 
+
+        return locals() 
+
+    set_highschool_periods = generate_m2m_setter("highschool_periods")
+
+    @Property
+    def highschool_periods_list(): #@NoSelf
+        def fget(self):
+            return [d.label for d in self.highschool_periods.all()] 
+
+        return locals() 
+
+    @Property
+    def highschool_periods_text(): #@NoSelf
+        def fget(self):
+            return "; ".join(self.highschool_periods_list) 
+
+        return locals() 
+
+    set_primary_themes = generate_m2m_setter("primary_themes")
+
+    @Property
+    def primary_themes_list(): #@NoSelf
+        def fget(self):
+            return [d.label for d in self.primary_themes.all()] 
+
+        return locals() 
+
+
+    @Property
+    def primary_themes_text(): #@NoSelf
+        def fget(self):
+            return "; ".join(self.primary_themes_list) 
+
+        return locals() 
+
+    set_college_themes = generate_m2m_setter("college_themes")
+
+    @Property
+    def college_themes_list(): #@NoSelf
+        def fget(self):
+            return [d.label for d in self.college_themes.all()] 
+
+        return locals() 
+    
+    @Property
+    def college_themes_text(): #@NoSelf
+        def fget(self):
+            return "; ".join(self.college_themes_list) 
+
+        return locals() 
+
+    set_highschool_themes = generate_m2m_setter("highschool_themes")
+
+    @Property
+    def highschool_themes_list(): #@NoSelf
+        def fget(self):
+            return [d.label for d in self.highschool_themes.all()] 
+
+        return locals()
+
+    @Property
+    def highschool_themes_text(): #@NoSelf
+        def fget(self):
+            return "; ".join(self.highschool_themes_list) 
+
+        return locals()
+
+    @Property
+    def town_text(): #@NoSelf
+        def fget(self):
+            return self.town.name if self.town else ""
+        
+        return locals()
+
+    @Property
+    def tags_text(): #@NoSelf
+        def fget(self):
+            return "; ".join([t.label for t in self.tags.all()])
+        
+        return locals()
+
+    @models.permalink
+    def get_absolute_url(self):
+        return ('display_datasheet', (), {
+                    'ds_id': self.hda_id
+                })
+
+
+class TaggedSheet(models.Model):
+    datasheet = models.ForeignKey(Datasheet)
+    tag = models.ForeignKey(Tag)
+    created_at = models.DateTimeField(auto_now_add=True)
+    original_order = models.IntegerField(null=False, blank=False, default=0)
+    order = models.IntegerField(null=False, blank=False, default=0, db_index=True)
+    index_note = models.FloatField(null=False, blank=False, default=0.0, db_index=True)
+    wikipedia_revision_id = models.BigIntegerField(unique=False, blank=True, null=True)
+    
+    @Property
+    def wikipedia_verion_permalink(): #@NoSelf
+        def fget(self):
+            return settings.WIKIPEDIA_VERSION_PERMALINK_TEMPLATE % (unicode(self.wikipedia_revision_id))
+        
+        return locals()
+
+
+class SortedDatasheetLink(models.Model):    
+    datasheet = models.ForeignKey(Datasheet, db_index=True, null=False, blank=False)
+    sort_value = models.IntegerField(null=False, blank=False)
+
+    class Meta:
+        abstract = True
+        ordering = ['sort_value']
+        
+
+class Datasheet_domains(SortedDatasheetLink):
+    domain = models.ForeignKey(Domain, db_index=True, null=False, blank=False)
+
+class Datasheet_highschool_periods(SortedDatasheetLink):
+    timeperiod = models.ForeignKey(TimePeriod, db_index=True, null=False, blank=False)
+
+class Datasheet_highschool_themes(SortedDatasheetLink):
+    domain = models.ForeignKey(Domain, db_index=True, null=False, blank=False)
+
+class Datasheet_college_periods(SortedDatasheetLink):
+    timeperiod = models.ForeignKey(TimePeriod, db_index=True, null=False, blank=False)
+
+class Datasheet_college_themes(SortedDatasheetLink):
+    domain = models.ForeignKey(Domain, db_index=True, null=False, blank=False)
+
+class Datasheet_primary_periods(SortedDatasheetLink):
+    timeperiod = models.ForeignKey(TimePeriod, db_index=True, null=False, blank=False)
+
+class Datasheet_primary_themes(SortedDatasheetLink):
+    domain = models.ForeignKey(Domain, db_index=True, null=False, blank=False)
+    
+        
+
+    
\ No newline at end of file