src/egonomy/models.py
author cavaliet
Wed, 10 Jul 2013 15:31:38 +0200
changeset 230 fb6932ba9a2b
parent 218 87fd3589b65a
child 256 f4b443fcddc7
permissions -rw-r--r--
update registration and password management, and version number to 0.6.10
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
21
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
# -*- coding: utf-8 -*-
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
'''
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
Created on Jan 28, 2013
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
@author: ymh
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
'''
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
from django.db import models
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
from django.contrib.auth.models import User
159
b98558f8d2c1 collection first step
cavaliet
parents: 149
diff changeset
    10
from django.contrib.contenttypes.models import ContentType
b98558f8d2c1 collection first step
cavaliet
parents: 149
diff changeset
    11
from django.contrib.contenttypes import generic
218
87fd3589b65a queries optimisation second step
cavaliet
parents: 191
diff changeset
    12
from egonomy.utils.queries import cache_generics
21
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
class ImageMetadata(models.Model):
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
    
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
    id = models.CharField(null=False, blank=False, max_length=15, primary_key=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
    date_inserted = models.DateTimeField(null=False, blank=False, auto_now_add=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
    date_modified = models.DateTimeField(null=False, blank=False, auto_now=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
    
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
    cliche = models.CharField(null=False, blank=False, max_length=15)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
    inventaire = models.TextField(null=True, blank=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
    titre = models.TextField(null=True, blank=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
    description = models.TextField(null=True, blank=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
    date = models.IntegerField(null=True, blank=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    longueur = models.DecimalField(null=True, blank=True, max_digits=20, decimal_places=15)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    hauteur = models.DecimalField(null=True, blank=True, max_digits=20, decimal_places=15)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    profondeur = models.DecimalField(null=True, blank=True, max_digits=20, decimal_places=15)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
    diametre = models.DecimalField(null=True, blank=True, max_digits=20, decimal_places=15)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    photographe = models.TextField(null=True, blank=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
    auteur = models.TextField(null=True, blank=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
    droits = models.TextField(null=True, blank=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
    mentions = models.TextField(null=True, blank=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
    periode = models.TextField(null=True, blank=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    technique = models.TextField(null=True, blank=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
    site = models.TextField(null=True, blank=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    lieu = models.TextField(null=True, blank=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    localisation = models.TextField(null=True, blank=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    mots_cles = models.TextField(null=True, blank=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
    titre_pertimm = models.TextField(null=True, blank=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
    description_pertimm = models.TextField(null=True, blank=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
    thesaurus_pertimm = models.TextField(null=True, blank=True)
67
a085d708c407 user fragment page and enhance pertimm display.
cavaliet
parents: 21
diff changeset
    43
    
a085d708c407 user fragment page and enhance pertimm display.
cavaliet
parents: 21
diff changeset
    44
    @property
69
412ab5e76c65 Clickable tags to easily add tags from rmn and pertimm.
cavaliet
parents: 67
diff changeset
    45
    def mots_cles_list(self):
412ab5e76c65 Clickable tags to easily add tags from rmn and pertimm.
cavaliet
parents: 67
diff changeset
    46
        return self.mots_cles.split(",")
412ab5e76c65 Clickable tags to easily add tags from rmn and pertimm.
cavaliet
parents: 67
diff changeset
    47
    
412ab5e76c65 Clickable tags to easily add tags from rmn and pertimm.
cavaliet
parents: 67
diff changeset
    48
    @property
412ab5e76c65 Clickable tags to easily add tags from rmn and pertimm.
cavaliet
parents: 67
diff changeset
    49
    def titre_pertimm_list(self):
412ab5e76c65 Clickable tags to easily add tags from rmn and pertimm.
cavaliet
parents: 67
diff changeset
    50
        return self.titre_pertimm.split(",")
412ab5e76c65 Clickable tags to easily add tags from rmn and pertimm.
cavaliet
parents: 67
diff changeset
    51
    
412ab5e76c65 Clickable tags to easily add tags from rmn and pertimm.
cavaliet
parents: 67
diff changeset
    52
    @property
412ab5e76c65 Clickable tags to easily add tags from rmn and pertimm.
cavaliet
parents: 67
diff changeset
    53
    def description_pertimm_list(self):
412ab5e76c65 Clickable tags to easily add tags from rmn and pertimm.
cavaliet
parents: 67
diff changeset
    54
        return self.description_pertimm.split(",")
412ab5e76c65 Clickable tags to easily add tags from rmn and pertimm.
cavaliet
parents: 67
diff changeset
    55
    
412ab5e76c65 Clickable tags to easily add tags from rmn and pertimm.
cavaliet
parents: 67
diff changeset
    56
    @property
412ab5e76c65 Clickable tags to easily add tags from rmn and pertimm.
cavaliet
parents: 67
diff changeset
    57
    def thesaurus_pertimm_list(self):
412ab5e76c65 Clickable tags to easily add tags from rmn and pertimm.
cavaliet
parents: 67
diff changeset
    58
        return self.thesaurus_pertimm.replace("|", ",").split(",")
140
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
    59
    
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
    60
    @property
175
8f6eef1d1fc8 collection available in list and mosaic
cavaliet
parents: 168
diff changeset
    61
    def tag_list(self):
140
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
    62
        # all keywords mots_cles + titre_pertimm+ description_pertimm + thesaurus_pertimmreturn
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
    63
        # merged into one sorted list
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
    64
        moc = self.mots_cles.split(",")
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
    65
        tip = self.titre_pertimm.split(",")
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
    66
        dep = self.description_pertimm.split(",")
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
    67
        thp = self.thesaurus_pertimm.replace("|", ",").split(",")
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
    68
        # sort by alphabetical order (sorted) and remove duplicates (set)
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
    69
        l = sorted(list(set(moc + tip + dep + thp)), key=unicode.lower)
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
    70
        return l
21
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
class ImageInfo(models.Model):
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
    
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
    id = models.CharField(null=False, blank=False, max_length=15, primary_key=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
    image_file = models.ImageField(width_field = "width", height_field= "height", upload_to="images/", max_length=2048)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
    width = models.IntegerField(null=False, blank=False)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
    height = models.IntegerField(null=False, blank=False)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
    mimetype = models.CharField(null=True, blank=True, max_length=1024)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
    exif = models.TextField(null=True, blank=True) #json value for exif data if available
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
    
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
class Image(models.Model):
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
    
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
    id = models.CharField(null=False, blank=False, max_length=15, primary_key=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
    metadata = models.ForeignKey(ImageMetadata)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
    info = models.ForeignKey(ImageInfo, null=True, blank=True)
175
8f6eef1d1fc8 collection available in list and mosaic
cavaliet
parents: 168
diff changeset
    88
    
8f6eef1d1fc8 collection available in list and mosaic
cavaliet
parents: 168
diff changeset
    89
    @property
8f6eef1d1fc8 collection available in list and mosaic
cavaliet
parents: 168
diff changeset
    90
    def tag_list(self):
8f6eef1d1fc8 collection available in list and mosaic
cavaliet
parents: 168
diff changeset
    91
        return self.metadata.tag_list
21
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
    
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
class Fragment(models.Model):
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
    
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
    image = models.ForeignKey(Image, blank=False, null=False)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
    date_created = models.DateTimeField(blank=False, null=False, auto_now_add=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
    date_saved = models.DateTimeField(blank=False, null=False, auto_now=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
    coordinates = models.TextField(blank=False, null=False)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
    author = models.ForeignKey(User, blank=False, null=False)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
    title = models.CharField(max_length=2048, blank=True, null=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
    description = models.TextField(blank=True, null=True)
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
    tags = models.TextField(blank=True, null=True)
74
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   104
    
149
af59627418e7 view fragment with new style
cavaliet
parents: 140
diff changeset
   105
    @property
af59627418e7 view fragment with new style
cavaliet
parents: 140
diff changeset
   106
    def tag_list(self):
af59627418e7 view fragment with new style
cavaliet
parents: 140
diff changeset
   107
        # tags in list
af59627418e7 view fragment with new style
cavaliet
parents: 140
diff changeset
   108
        return self.tags.split(",")
af59627418e7 view fragment with new style
cavaliet
parents: 140
diff changeset
   109
    
74
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   110
    
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   111
    def get_viewbox_info(self):
89
da5504ff262e debug and first step of senseetive request
cavaliet
parents: 74
diff changeset
   112
        if not self.coordinates or self.coordinates=="MZ" or self.coordinates=="":
74
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   113
            return None,None,None,None
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   114
        # Now we split the coordinates to get the path points's max and min x and y
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   115
        # A typical path is M0.1995 0.1574L0.3718 0.0131L0.7731 0.0597L0.5126 0.2915Z
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   116
        points_str = self.coordinates.strip("M").strip("Z").split("L")
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   117
        points_x = []
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   118
        points_y = []
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   119
        for p in points_str:
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   120
            xy = p.split(" ")
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   121
            points_x.append(float(xy[0]))
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   122
            points_y.append(float(xy[1]))
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   123
        # At this point, values are floats like 19.95, 15.74...
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   124
        min_x = min(points_x)
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   125
        max_x = max(points_x)
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   126
        min_y = min(points_y)
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   127
        max_y = max(points_y)
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   128
        # At this point, values are floats like 19, 15...
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   129
        # Now we build the viewbox, which is min_x min_y (max_x-min_x) (max_y-min_y) with number like 0.19 0.15...
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   130
        # We use floor and +2 for the viewbox to be a bit larger than the strict fragment
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   131
        vb_x = min_x
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   132
        vb_y = min_y
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   133
        vb_w = max_x - min_x
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   134
        vb_h = max_y - min_y
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   135
        return vb_x, vb_y, vb_w, vb_h
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   136
    
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   137
    # This property returns a ratio between width and height
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   138
    @property
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   139
    def ratio(self):
89
da5504ff262e debug and first step of senseetive request
cavaliet
parents: 74
diff changeset
   140
        if not self.coordinates or self.coordinates=="MZ" or self.coordinates=="":
93
0a75599363e9 Senseetive api : generate fragment with good ratio and not forced square.
cavaliet
parents: 89
diff changeset
   141
            return 1
74
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   142
        _, _, vb_w, vb_h = self.get_viewbox_info()
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   143
        return vb_w/vb_h
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   144
    
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   145
    # This property returns a viewbox used in the swg xml and enbling to see the fragment only
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   146
    @property
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   147
    def viewbox(self):
89
da5504ff262e debug and first step of senseetive request
cavaliet
parents: 74
diff changeset
   148
        if not self.coordinates or self.coordinates=="MZ" or self.coordinates=="":
74
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   149
            return "0 0 1 1"
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   150
        vb_x, vb_y, vb_w, vb_h = self.get_viewbox_info()
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   151
        vb = str(vb_x) + " " + str(vb_y) + " " + str(vb_w) + " " + str(vb_h)
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   152
        return vb
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   153
    
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   154
    # This property returns a square viewbox used in the swg xml and enbling to see the fragment only
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   155
    @property
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   156
    def viewbox_square(self):
89
da5504ff262e debug and first step of senseetive request
cavaliet
parents: 74
diff changeset
   157
        if not self.coordinates or self.coordinates=="MZ" or self.coordinates=="":
74
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   158
            return "0 0 1 1"
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   159
        vb_x, vb_y, vb_w, vb_h = self.get_viewbox_info()
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   160
        img_info = self.image.info
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   161
        img_ratio = float(img_info.width) / float(img_info.height)
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   162
        if vb_w > vb_h:
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   163
            # If fragment w > h, we center the fragment on y ...
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   164
            vb_y = max(0, vb_y - (((vb_w * img_ratio) - vb_h) / 2))
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   165
            # ... and resize the viewbox's h with image's ratio
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   166
            vb_h = vb_w * img_ratio
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   167
        else:
140
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
   168
            # If fragment w <= h, we center the fragment on x ...
74
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   169
            vb_x = max(0, vb_x - (((vb_h / img_ratio) - vb_w) / 2))
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   170
            # ... and we resize the viewbox's w with image's ratio
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   171
            vb_w = vb_h / img_ratio
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   172
        vb = str(vb_x) + " " + str(vb_y) + " " + str(vb_w) + " " + str(vb_h)
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   173
        
5a3d8a3eb34d Display fragment only in all_fragment template.
cavaliet
parents: 69
diff changeset
   174
        return vb
140
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
   175
159
b98558f8d2c1 collection first step
cavaliet
parents: 149
diff changeset
   176
b98558f8d2c1 collection first step
cavaliet
parents: 149
diff changeset
   177
140
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
   178
class Collection(models.Model):
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
   179
    
191
d7b30914607d enhance collection and add slideshow with images and fragments.
cavaliet
parents: 175
diff changeset
   180
    LIST = 1
140
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
   181
    MOSAIC = 2
191
d7b30914607d enhance collection and add slideshow with images and fragments.
cavaliet
parents: 175
diff changeset
   182
    SLIDESHOW = 3
d7b30914607d enhance collection and add slideshow with images and fragments.
cavaliet
parents: 175
diff changeset
   183
    GEOGRAPHICAL = 4
140
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
   184
      
159
b98558f8d2c1 collection first step
cavaliet
parents: 149
diff changeset
   185
    PUBLICATION_CHOICES = (
191
d7b30914607d enhance collection and add slideshow with images and fragments.
cavaliet
parents: 175
diff changeset
   186
    (LIST, 'list'),
d7b30914607d enhance collection and add slideshow with images and fragments.
cavaliet
parents: 175
diff changeset
   187
    (MOSAIC, 'mosaic'),
140
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
   188
    (SLIDESHOW, 'slideshow'),
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
   189
    (GEOGRAPHICAL, 'geographical')
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
   190
    )
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
   191
    
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
   192
    
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
   193
    title = models.CharField(max_length=2048, blank=True, null=True)
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
   194
    description = models.TextField(blank=True, null=True)
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
   195
    author = models.ForeignKey(User, blank=False, null=False)
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
   196
    creation = models.DateTimeField(auto_now_add=True)
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
   197
    modification = models.DateTimeField(auto_now=True)
159
b98558f8d2c1 collection first step
cavaliet
parents: 149
diff changeset
   198
    public = models.BooleanField(null=False, default=True) # Collection is published or not, always published by default
191
d7b30914607d enhance collection and add slideshow with images and fragments.
cavaliet
parents: 175
diff changeset
   199
    publication_type = models.IntegerField(choices=PUBLICATION_CHOICES, default=1) # list, mosaic, slideshow or geographical
218
87fd3589b65a queries optimisation second step
cavaliet
parents: 191
diff changeset
   200
    
87fd3589b65a queries optimisation second step
cavaliet
parents: 191
diff changeset
   201
    @property
87fd3589b65a queries optimisation second step
cavaliet
parents: 191
diff changeset
   202
    def first_four_items(self):
87fd3589b65a queries optimisation second step
cavaliet
parents: 191
diff changeset
   203
        items = CollectionItem.objects.filter(collection=self).select_related('author', 'content_type', 'object_id', 'content_object').order_by("order")[:4]
87fd3589b65a queries optimisation second step
cavaliet
parents: 191
diff changeset
   204
        cache_generics(items)
87fd3589b65a queries optimisation second step
cavaliet
parents: 191
diff changeset
   205
        return items
159
b98558f8d2c1 collection first step
cavaliet
parents: 149
diff changeset
   206
b98558f8d2c1 collection first step
cavaliet
parents: 149
diff changeset
   207
b98558f8d2c1 collection first step
cavaliet
parents: 149
diff changeset
   208
b98558f8d2c1 collection first step
cavaliet
parents: 149
diff changeset
   209
class CollectionItem(models.Model):
b98558f8d2c1 collection first step
cavaliet
parents: 149
diff changeset
   210
    
b98558f8d2c1 collection first step
cavaliet
parents: 149
diff changeset
   211
    content_type = models.ForeignKey(ContentType) # can be image ou fragment
168
c90576d18319 argumentaire/list collection view
cavaliet
parents: 159
diff changeset
   212
    object_id = models.CharField(null=False, blank=False, max_length=15) # has to be char because of image id
159
b98558f8d2c1 collection first step
cavaliet
parents: 149
diff changeset
   213
    content_object = generic.GenericForeignKey('content_type', 'object_id')
b98558f8d2c1 collection first step
cavaliet
parents: 149
diff changeset
   214
    description = models.TextField(blank=True, null=True)
b98558f8d2c1 collection first step
cavaliet
parents: 149
diff changeset
   215
    order = models.IntegerField()
b98558f8d2c1 collection first step
cavaliet
parents: 149
diff changeset
   216
    # An item belongs to only one collection. Collection will have "items" related name.
b98558f8d2c1 collection first step
cavaliet
parents: 149
diff changeset
   217
    collection = models.ForeignKey(Collection, related_name='items')
140
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
   218
    
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
   219
    
bfe995fae627 update js and new view image template
cavaliet
parents: 93
diff changeset
   220
    
21
5f3e270580af First model or egonomy
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221