Projet

Général

Profil

wcs-add-formdata-tracking-code.diff

Thomas Noël, 26 mars 2012 15:04

Télécharger (2,98 ko)

Voir les différences:


  

wcs/formdata.py
16 16

  
17 17
import time
18 18
import urllib
19
import random
20
import binascii
19 21

  
20 22
from quixote import get_request, get_publisher
21 23

  
......
47 49
    return new_data
48 50

  
49 51

  
52
TRACKING_CODE_SIZE = 7
53

  
54
class TrackingCode(StorableObject):
55
    _names = 'tracking_code'
56

  
57
    def __init__(self, formdef_id, formdata_id):
58
        StorableObject.__init__(self, self.get_new_id())
59
        self.formdef_id = formdef_id
60
        self.formdata_id = formdata_id
61

  
62
    def get_new_id(cls):
63
        r = random.SystemRandom()
64
        while True:
65
            id = '%%0.%dd' % TRACKING_CODE_SIZE % r.randint(0, 10**TRACKING_CODE_SIZE-1)
66
            # add a "security code"
67
            id = id + '%d' % (binascii.crc32(id) % 10)
68
            if not cls.has_key(id):
69
                return id
70

  
71
    def check_crc(cls, id):
72
        return id[-1] == '%d' % (binascii.crc32(id[:-1]) % 10)
73
    check_crc = classmethod(check_crc)
74

  
75

  
50 76
class Evolution:
51 77
    who = None
52 78
    status = None
......
89 115
    data = None
90 116
    editable_by = None
91 117
    _signature = None
118
    tracking_code = None
92 119

  
93 120
    _formdef = None
94 121
    def get_formdef(self):
......
145 172
        evo.status = self.status
146 173
        self.evolution = [evo]
147 174

  
175
    def store(self, async=False):
176
        StorableObject.store(self, async=async)
177
        # add a tracking code
178
        if not self.tracking_code:
179
            tc = TrackingCode(self.formdef.id, self.id)
180
            self.tracking_code = tc.id
181
            tc.store(async=async)
182
            StorableObject.store(self, async=async)
183

  
148 184
    def perform_workflow(self):
149 185
        url = None
150 186
        get_publisher().substitutions.feed(self)
......
230 266
            'form_uri': '%s/%s/' % (self.formdef.url_name, self.id),
231 267
            'form_status_url': '%sstatus' % self.get_url(),
232 268
            'form_details': self.formdef.get_detailed_email_form(self, self.get_url()),
269
            'form_tracking_code': self.tracking_code or '',
233 270
        }
234 271

  
235 272
        user = self.get_user()
......
309 346
Substitutions.register('form_url', category=N_('Form'), comment=N_('Form URL'))
310 347
Substitutions.register('form_url_backoffice', category=N_('Form'), comment=N_('Form URL (backoffice)'))
311 348
Substitutions.register('form_status_url', category=N_('Form'), comment=N_('Form Status URL'))
349
Substitutions.register('form_tracking_code', category=N_('Form'), comment=N_('Form Tracking Code'))
312 350
Substitutions.register('form_user', category=N_('Form'), comment=N_('Form Submitter'))
313 351
Substitutions.register('form_user_display_name', category=N_('Form'), comment=N_('Form Submitter Name'))
314 352
Substitutions.register('form_user_email', category=N_('Form'), comment=N_('Form Submitter Email'))