src/cm/models_base.py
author Simon Descarpentries <sid@sopinspace.com>
Mon, 21 Oct 2013 16:37:07 +0200
changeset 553 bf26fb47a14c
parent 472 39f17ac0388c
permissions -rw-r--r--
To allow scrolling in Safari mobile, we set the content of text_view_comments frame in a jQuery UI layout. So the automated scrolling operations in c_sync.js must be adjustable to the right part to scroll. Also, if a comment have to be shown outside of the current viewport, we scroll the correct part to that viewport and then set the comment top Y offset to juste what it needs to avoid the "Add comment" button after scrolling operation. If not in Safari mobile, we add an offset here to avoid comment to display under the "Add comment" button.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
from django.contrib.auth.models import User
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
from django.db import models
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
from django.utils.translation import ugettext as _
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
import random
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
random.seed()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
# no 0,1,o,l,O (difficult to differentiate)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
KEY_CHARS = '23456789' + \
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
            'abcdefghijklmnpqrstuvwxyz' + \
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
            'ABCDEFGHIJKLMNPQRSTUVWXYZ'  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
KEY_SIZE = 11
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
# database column length
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
KEY_MAX_SIZE = 20
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
def generate_key(size=KEY_SIZE):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
    key = ''.join([random.choice(KEY_CHARS) for i in range(size)])
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
    return key
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
class KeyModel(models.Model):        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
    key      = models.CharField(max_length=KEY_MAX_SIZE, db_index=True, unique=True, blank=False)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
    adminkey = models.CharField(max_length=KEY_MAX_SIZE, db_index=True, unique=True, blank=False)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
    class Meta:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
        abstract = True
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
class PermanentModel(KeyModel):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
    """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
    Permanent model: delete only sets a flag in database 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
    """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
    deleted = models.BooleanField(default=False, db_index=True)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
    state = models.CharField(max_length=16, blank=False)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
    class Meta:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
        abstract = True
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
    def delete(self):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
        self.deleted = True
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
        self.save()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
    def undelete(self):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
        self.deleted = False
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
        self.save()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
    def real_delete(self):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
        super(KeyModel, self).delete() 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
class AuthorModel(models.Model):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
    user = models.ForeignKey(User, blank=True, null=True)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
    name = models.CharField(_("Name:"), max_length=100, null=True, blank=True)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
    email = models.CharField(_("Email:"), max_length=100, null=True, blank=True)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
    class Meta:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
        abstract = True
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
    def get_name(self):
292
3442202aff1a add parameter to display "decorated" creator (used with api calls)
raph
parents: 0
diff changeset
    60
        from cm.cm_settings import DECORATED_CREATORS
3442202aff1a add parameter to display "decorated" creator (used with api calls)
raph
parents: 0
diff changeset
    61
        
472
39f17ac0388c Use co-ment user name when co-ment is directly accessed, even if DECORATED_CREATORS is True (i.e. normaly accessed by API).
gibus
parents: 292
diff changeset
    62
        if self.user and (not DECORATED_CREATORS or self.name == None):
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
            return self.user.username
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
        else:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
            return self.name
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
    def get_email(self):
292
3442202aff1a add parameter to display "decorated" creator (used with api calls)
raph
parents: 0
diff changeset
    68
        from cm.cm_settings import DECORATED_CREATORS
3442202aff1a add parameter to display "decorated" creator (used with api calls)
raph
parents: 0
diff changeset
    69
        
472
39f17ac0388c Use co-ment user name when co-ment is directly accessed, even if DECORATED_CREATORS is True (i.e. normaly accessed by API).
gibus
parents: 292
diff changeset
    70
        if self.user and (not DECORATED_CREATORS or self.email == None):
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
            return self.user.email
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
        else:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    73
            return self.email
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    74
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    75
    def set_email_or_user(self, email_or_user):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
        if type(email_or_user) == User:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
            self.user = email_or_user
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    78
        else:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
            self.email = email_or_user
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80
        self.save()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    81
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    82
class KeyManager(models.Manager):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    83
    """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    84
    Manager for key-models
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    85
    """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    86
    def _gen_key(self):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    87
        # generate unique key
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    88
        key = generate_key()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    89
        while self.filter(key=key).count():
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    90
            key = generate_key()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    91
        return key
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    92
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    93
    def _gen_adminkey(self):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    94
        # generate unique adminkey
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    95
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    96
        adminkey = generate_key()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    97
        while self.filter(adminkey=adminkey).count():
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    98
            adminkey = generate_key()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    99
        return adminkey
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   100
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   101
    def create(self, *args, **kwargs):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   102
        key = self._gen_key()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   103
        adminkey = self._gen_adminkey()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   104
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   105
        obj = models.Manager.create(self, key=key, adminkey=adminkey, *args, **kwargs)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   106
        return obj
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   107
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   108
    def update_keys(self, comment):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   109
        comment.key = self._gen_key()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   110
        comment.adminkey = self._gen_adminkey()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   111
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   112
    def real_all(self):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   113
        return super(KeyManager, self).get_query_set()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   114
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   115
class Manager(KeyManager):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   116
    """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   117
    Manager for permanent- and key- models
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   118
    """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   119
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   120
    def get_query_set(self):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   121
        return super(KeyManager, self).get_query_set().filter(deleted=False)    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   122