summaryrefslogtreecommitdiff
path: root/meetingtools/apps/content/models.py
blob: 621111fa502c5fc0c7aaabb4af5efd54b5e32ce1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# -*- coding: utf-8 -*-
__author__ = 'lundberg'

from django.db import models, IntegrityError
from django.db.models.fields import CharField, BigIntegerField, IntegerField
from django.db.models.fields.related import ForeignKey
from django.contrib.auth.models import User
from meetingtools.apps.sco.models import ACObject, get_sco
import tagging
from tagging.models import Tag
from django.core.cache import cache


class Content(models.Model):
    creator = ForeignKey(User, editable=False, null=True)
    name = CharField(max_length=128)
    sco = ForeignKey(ACObject, editable=False, null=True, unique=True)
    folder_sco = ForeignKey(ACObject, null=True, related_name="content_folders")
    type = CharField(max_length=128)
    urlpath = CharField(max_length=128)
    bytecount = BigIntegerField()
    created = models.DateTimeField()
    modified = models.DateTimeField()
    views = IntegerField()
    lastviewed = models.DateTimeField(blank=True, null=True)

    class Meta:
        verbose_name_plural = 'Content'

    def __unicode__(self):
        return "%s (sco_id=%s,folder_sco_id=%s,urlpath=%s)" % (self.name, self.sco.sco_id, self.folder_sco.sco_id,
                                                               self.urlpath)

    @staticmethod
    def by_sco(sco):
        return Content.objects.get(sco=sco)

    @staticmethod
    def by_id(acc, sco_id):
        return Content.by_sco(get_sco(acc, sco_id))

    @staticmethod
    def by_name(acc, name):
        return Content.objects.get(sco__acc=acc, name=name)

    def go_url(self):
        return "%s%s" % (self.sco.acc.url, self.urlpath.strip("/"))

    def download_url(self):
        return "%s%s/output/%s.zip?download=zip" % (self.sco.acc.url, self.urlpath.strip("/"), self.urlpath.strip("/"))

    @staticmethod
    def create(acc, api, row):
        sco_id = row.get('sco-id')
        byte_count = api.get_byte_count(sco_id)
        if byte_count or byte_count == 0:
            sco_element = api.get_sco_info(sco_id)
            if not sco_element.get('source-sco-id'):  # Object is not a reference
                views = api.get_sco_views(sco_id)

                owner = api.get_owner(sco_element.findtext('url-path'))
                if not owner:
                    owner = get_owner_by_folder(api, acc, sco_element)
                try:
                    domain = owner['login'].split('@')[1]
                    user, created = User.objects.get_or_create(username=owner['login'])
                    if created:
                        user.set_unusable_password()
                except IndexError:
                    user = None
                    domain = None

                datecreated = row.findtext('date-created')
                if not datecreated:
                    datecreated = row.findtext('date-modified')
                try:
                    content, created = Content.objects.get_or_create(
                        sco=get_sco(acc, sco_id),
                        creator=user,
                        name=row.findtext('name'),
                        folder_sco=get_sco(acc, sco_element.get('folder-id')),
                        type=row.get('icon'),
                        urlpath=row.findtext('url'),
                        bytecount=byte_count,
                        created=datecreated,
                        modified=row.findtext('date-modified'),
                        views=views['views'],
                        lastviewed=views['last-viewed-date']
                    )
                except IntegrityError:
                    content = Content.objects.get(sco=get_sco(acc, sco_id))
                    created = False
                if not created:
                    Content.objects.filter(sco=content.sco).update(
                        creator=user,
                        name=row.findtext('name'),
                        folder_sco=get_sco(acc, sco_element.get('folder-id')),
                        type=row.get('icon'),
                        urlpath=row.findtext('url'),
                        bytecount=byte_count,
                        modified=row.findtext('date-modified'),
                        views=views['views'],
                        lastviewed=views['last-viewed-date']
                    )

                if user and domain:
                    tags = []
                    for group in user.groups.all():
                        tags.append("group:%s" % group.name)
                    tags.append("domain:%s" % domain)
                    Tag.objects.update_tags(content, ' '.join(tags))

tagging.register(Content)


def get_owner_by_folder(api, acc, sco):
    default_folders = ['Shared Templates', 'Shared Content', 'User Content', 'Shared Meetings', 'User Meetings',
                       '{tree-type-account-custom}', 'Forced Recordings', 'Chat Transcripts']
    key = 'ac:owner:%s/%s' % (acc, sco.get('sco-id'))
    owner = cache.get(key)
    if owner is None:
        fid = sco.get('folder-id')
        if not fid:
            return None
        folder_id = int(fid)
        r = api.request('sco-info', {'sco-id': folder_id}, False)
        if r.status_code() == 'no-data':
            return None
        parent = r.et.xpath("//sco")[0]
        if parent is not None:
            if parent.findtext('name') in default_folders:
                owner = {
                    'login': sco.findtext('name'),  # To match api.get_owner
                    'sco_id': sco.get('sco-id'),
                }
            else:
                owner = get_owner_by_folder(api, acc, parent)

            if owner is not None:
                cache.set(key, owner, 30)
    return owner