source: OpenWorkouts-current/ow/models/bulk.py @ fcf0ef3

current
Last change on this file since fcf0ef3 was fcf0ef3, checked in by Borja Lopez <borja@…>, 5 years ago

(#77) Bulk workouts upload:

  • Added a new Folder-like object under the root object to store compressed files
  • Added a new Blob-like object to store those compressed files into the database
  • Added the needed view/template code to handle adding/uploading compressed files that may contain workout tracking files + a page to see them per-user
  • Property mode set to 100644
File size: 2.5 KB
Line 
1from uuid import uuid1
2from datetime import datetime, timedelta, timezone
3
4from repoze.folder import Folder
5from pyramid.security import Allow, Deny, Everyone, ALL_PERMISSIONS
6
7import pytz
8
9
10class BulkFile(Folder):
11
12    """
13    Object that maps to a compressed file uploaded by a user to upload several
14    workout tracking files at once.
15    """
16
17    __parent__ = __name__ = None
18
19    def __acl__(self):
20        """
21        Owner of the compressed file has full permissions to the file, as well
22        as system admins. Everybody else has no permissions.
23        """
24        permissions = [
25            (Allow, str(self.uid), 'view'),
26            (Allow, str(self.uid), 'edit'),
27            (Allow, str(self.uid), 'delete'),
28            (Deny, Everyone, ALL_PERMISSIONS)
29        ]
30        return permissions
31
32    def __init__(self, **kw):
33        super(BulkFile, self).__init__()
34        self.bfid = uuid1()
35        self.uid = kw['uid']  # required, so let it blow if none is given
36        self.uploaded = kw.get('uploaded', datetime.now(timezone.utc))
37        self.compressed_file = kw.get('compressed_file', None)  # Blob
38        self.file_name = ''  # unicode string
39        self.file_type = ''  # unicode string
40        self.loaded = False  # datetime when workouts have been loaded
41        self.workout_ids = []  # ids of the workouts loaded from this file
42
43    def _in_timezone(self, timezone, value):
44        """
45        Return a string representation of the given value  date and time,
46        localized into the given timezone
47        """
48        _value = value.astimezone(pytz.timezone(timezone))
49        return _value.strftime('%d/%m/%Y %H:%M (%Z)')
50
51    def uploaded_in_timezone(self, timezone):
52        return self._in_timezone(timezone, self.uploaded)
53
54    def loaded_in_timezone(self, timezone):
55        if self.loaded:
56            return self._in_timezone(timezone, self.loaded)
57        return ''
58
59
60class BulkFiles(Folder):
61
62    """
63    Container for bulk upload compressed files
64    """
65
66    __parent__ = __name__ = None
67
68    def __acl__(self):
69        """
70        Everybody can view, super users can edit
71        """
72        permissions = [
73            (Allow, Everyone, 'view'),
74            (Allow, 'admins', 'edit'),
75            (Deny, Everyone, ALL_PERMISSIONS)
76        ]
77        return permissions
78
79    def add_bulk_file(self, bulk_file):
80        self[str(bulk_file.bfid)] = bulk_file
81
82    def get_by_uid(self, uid):
83        """
84        Return bulk files owned by the given uid
85        """
86        return [self[bf] for bf in self if self[bf].uid == str(uid)]
Note: See TracBrowser for help on using the repository browser.