author | ymh <ymh.work@gmail.com> |
Sat, 25 Oct 2014 05:43:01 +0200 | |
changeset 66 | 658561ea9e65 |
parent 22 | 986ee928a866 |
child 67 | 7db9c7ec691a |
permissions | -rw-r--r-- |
0 | 1 |
|
2 |
# |
|
3 |
# See LICENCE for detail |
|
4 |
# Copyright (c) 2014 IRI |
|
5 |
# |
|
6 |
||
66
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
7 |
import bisect |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
8 |
import datetime |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
9 |
import json |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
10 |
import logging |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
11 |
import re |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
12 |
import uuid |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
13 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
14 |
from dateutil.parser import parse as parse_date_raw |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
15 |
from dateutil.tz import tzutc |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
16 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
17 |
from lxml import etree |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
18 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
19 |
import requests |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
20 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
21 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
22 |
logger = logging.getLogger(__name__) |
0 | 23 |
|
24 |
PIANOROLL_CHANNEL = 'PIANOROLL' |
|
25 |
ANNOTATION_CHANNEL = 'ANNOT' |
|
66
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
26 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
27 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
28 |
class AnnotationsSynchronizer(object): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
29 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
30 |
LDT_CONTENT_REST_API_PATH = "api/ldt/1.0/contents/" |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
31 |
LDT_PROJECT_REST_API_PATH = "api/ldt/1.0/projects/" |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
32 |
DEFAULT_ANNOTATION_CHANNEL = 'ANNOT' |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
33 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
34 |
def parse_date(self, datestr): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
35 |
res = parse_date_raw(datestr) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
36 |
if res.tzinfo is None: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
37 |
res = res.replace(tzinfo=tzutc()) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
38 |
return res |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
39 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
40 |
def find_delta(self, ts): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
41 |
if self.deltas: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
42 |
i = bisect.bisect_right(self.deltas, (ts+1,0)) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
43 |
if i: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
44 |
return self.deltas[i-1] |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
45 |
return (0,0) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
46 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
47 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
48 |
def get_filter(self): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
49 |
res = [] |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
50 |
if self.start_date: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
51 |
res.append({'name': 'ts', 'op': ">=", 'val':self.start_date.isoformat() }) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
52 |
if self.end_date: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
53 |
res.append({'name': 'ts', 'op': "<=", 'val':self.end_date.isoformat() }) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
54 |
if self.events: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
55 |
res.append({'name': 'event_code', 'op': "in", 'val': self.events }) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
56 |
if self.channels: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
57 |
res.append({'name': 'channel', 'op': "in", 'val': self.channels }) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
58 |
if self.user_whitelist: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
59 |
res.append({'name': 'user', 'op': "in", 'val': self.user_whitelist }) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
60 |
return res |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
61 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
62 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
63 |
def build_annotation_iterator(self, params): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
64 |
page = 0 |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
65 |
page_nb = 1 |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
66 |
while page < page_nb: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
67 |
page += 1 |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
68 |
params['page'] = page |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
69 |
resp = requests.get(self.annot_url, params=params, headers={'Content-Type': 'application/json'}) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
70 |
if resp.status_code != requests.codes.ok: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
71 |
self.logger.debug("build_annotation_iterator : request %s : return code %r " % (resp.request.url, resp.status_code)) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
72 |
return |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
73 |
resp_json = resp.json() |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
74 |
page_nb = resp_json.get('total_pages', 1) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
75 |
for item in resp_json.get('objects', []): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
76 |
#TODO: add progress log |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
77 |
yield item |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
78 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
79 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
80 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
81 |
def __init__(self, start_date=None, end_date=None, duration=None, content_file=None, |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
82 |
content_file_write=None, project_id=None, |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
83 |
channels=[DEFAULT_ANNOTATION_CHANNEL], events=[], annot_url=None, |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
84 |
user_whitelist=None, post_param={}, deltas=None, base_url="http://ldt.iri.centrepompidou.fr/ldtplatform/", |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
85 |
content=None, content_id=None, video=None, |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
86 |
replace=True, merge=False, name="", batch_size=500, |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
87 |
filename="project.ldt", color="16763904", logger=logger): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
88 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
89 |
self.logger = logger |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
90 |
self.base_url = base_url.rstrip("/")+"/" if base_url else base_url |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
91 |
self.deltas = deltas |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
92 |
self.post_param = {} |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
93 |
if isinstance(post_param, basestring): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
94 |
self.post_param = json.loads(post_param) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
95 |
elif post_param: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
96 |
self.post_param = post_param |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
97 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
98 |
self.start_date = None |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
99 |
if start_date: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
100 |
if isinstance(start_date, datetime.datetime): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
101 |
self.start_date = start_date |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
102 |
else: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
103 |
self.start_date = self.parse_date(str(start_date)) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
104 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
105 |
self.duration = duration |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
106 |
self.end_date = None |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
107 |
if end_date: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
108 |
if isinstance(end_date, datetime.datetime): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
109 |
self.end_date = end_date |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
110 |
else: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
111 |
self.end_date= self.parse_date(str(end_date)) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
112 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
113 |
if end_date: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
114 |
if isinstance(end_date, datetime.datetime): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
115 |
self.end_date = end_date |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
116 |
else: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
117 |
self.end_date= self.parse_date(str(end_date)) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
118 |
elif self.start_date and self.duration: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
119 |
self.end_date = self.start_date + datetime.timedelta(seconds=self.duration) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
120 |
elif self.start_date and self.base_url: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
121 |
# get duration from api |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
122 |
content_url = self.base_url + AnnotationsSynchronizer.LDT_CONTENT_REST_API_PATH + content_id + "/?format=json" |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
123 |
self.logger.debug("get duration " + content_url) #@UndefinedVariable |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
124 |
r = requests.get(content_url, params=self.post_param) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
125 |
self.logger.debug("get duration resp " + repr(r)) #@UndefinedVariable |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
126 |
self.duration = int(r.json()['duration']) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
127 |
self.logger.debug("get duration " + repr(self.duration)) #@UndefinedVariable |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
128 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
129 |
self.end_date = self.start_date + datetime.timedelta(seconds=int(self.duration/1000)) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
130 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
131 |
if self.end_date and self.deltas: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
132 |
self.end_date = self.end_date + datetime.timedelta(milliseconds=self.deltas[-1][1]) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
133 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
134 |
self.content_file = content_file |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
135 |
self.project_id = project_id |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
136 |
if self.project_id is not None: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
137 |
self.content_file = self.base_url + AnnotationsSynchronizer.LDT_PROJECT_REST_API_PATH + self.project_id + "/?format=json" |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
138 |
self.content_file_write = content_file_write |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
139 |
if self.content_file_write is None and self.project_id: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
140 |
self.content_file_write = self.content_file |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
141 |
self.channels = list(set(channels)) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
142 |
self.annot_url = annot_url |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
143 |
self.events = list(set(events)) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
144 |
self.user_whitelist_file = user_whitelist |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
145 |
if self.user_whitelist_file: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
146 |
with open(user_whitelist_file, 'r+') as f: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
147 |
self.user_whitelist = list(set([s.strip() for s in f])) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
148 |
else: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
149 |
self.user_whitelist = None |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
150 |
self.content = content |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
151 |
self.content_id = content_id |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
152 |
self.video = video |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
153 |
self.replace = replace |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
154 |
self.merge = merge |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
155 |
self.name = name |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
156 |
self.batch_size = batch_size |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
157 |
self.filename = filename |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
158 |
self.color = color |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
159 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
160 |
def export_annotations(self): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
161 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
162 |
root = None |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
163 |
ensemble_parent = None |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
164 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
165 |
#to do : analyse situation ldt or iri ? filename set or not ? |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
166 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
167 |
if self.content_file and self.content_file.find("http://") == 0: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
168 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
169 |
self.logger.debug("url : " + self.content_file) #@UndefinedVariable |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
170 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
171 |
r = requests.get(self.content_file, params=self.post_param) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
172 |
self.logger.debug("url response " + repr(r) + " content " + repr(r.text)) #@UndefinedVariable |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
173 |
project = r.json() |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
174 |
text_match = re.match(r"\<\?\s*xml.*?\?\>(.*)", project['ldt'], re.I|re.S) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
175 |
root = etree.fromstring(text_match.group(1) if text_match else project['ldt']) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
176 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
177 |
elif self.content_file and os.path.exists(self.content_file): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
178 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
179 |
doc = etree.parse(self.content_file) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
180 |
root = doc.getroot() |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
181 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
182 |
content_id = None |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
183 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
184 |
if root is None: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
185 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
186 |
root = etree.Element(u"iri") |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
187 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
188 |
project = etree.SubElement(root, u"project", {u"abstract":u"Annotations",u"title":u"Annotations", u"user":u"IRI Web", u"id":unicode(uuid.uuid4())}) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
189 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
190 |
medias = etree.SubElement(root, u"medias") |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
191 |
media = etree.SubElement(medias, u"media", {u"pict":u"", u"src":unicode(self.content), u"video":unicode(self.video), u"id":unicode(self.content_id), u"extra":u""}) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
192 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
193 |
annotations = etree.SubElement(root, u"annotations") |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
194 |
content = etree.SubElement(annotations, u"content", {u"id":unicode(self.content_id)}) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
195 |
ensemble_parent = content |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
196 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
197 |
content_id = self.content_id |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
198 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
199 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
200 |
if ensemble_parent is None: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
201 |
file_type = None |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
202 |
for node in root: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
203 |
if node.tag == "project": |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
204 |
file_type = "ldt" |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
205 |
break |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
206 |
elif node.tag == "head": |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
207 |
file_type = "iri" |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
208 |
break |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
209 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
210 |
if file_type == "ldt": |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
211 |
media_nodes = root.xpath("//media") |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
212 |
if len(media_nodes) > 0: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
213 |
media = media_nodes[0] |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
214 |
annotations_node = root.find(u"annotations") |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
215 |
if annotations_node is None: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
216 |
annotations_node = etree.SubElement(root, u"annotations") |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
217 |
content_node = annotations_node.find(u"content") |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
218 |
if content_node is None: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
219 |
content_node = etree.SubElement(annotations_node,u"content", id=media.get(u"id")) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
220 |
ensemble_parent = content_node |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
221 |
content_id = content_node.get(u"id") |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
222 |
display_nodes = root.xpath("//displays/display/content[@id='%s']" % content_id) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
223 |
if len(display_nodes) == 0: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
224 |
self.logger.info("No display node found. Will not update display") |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
225 |
display_content_node = None |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
226 |
else: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
227 |
display_content_node = display_nodes[0] |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
228 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
229 |
elif file_type == "iri": |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
230 |
body_node = root.find(u"body") |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
231 |
if body_node is None: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
232 |
body_node = etree.SubElement(root, u"body") |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
233 |
ensembles_node = body_node.find(u"ensembles") |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
234 |
if ensembles_node is None: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
235 |
ensembles_node = etree.SubElement(body_node, u"ensembles") |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
236 |
ensemble_parent = ensembles_node |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
237 |
content_id = root.xpath("head/meta[@name='id']/@content")[0] |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
238 |
display_content_node = None |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
239 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
240 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
241 |
if ensemble_parent is None: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
242 |
self.logger.error("Can not process file") #@UndefinedVariable |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
243 |
sys.exit() |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
244 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
245 |
if self.replace: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
246 |
for ens in ensemble_parent.iterchildren(tag=u"ensemble"): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
247 |
ens_id = ens.get("id","") |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
248 |
if ens_id.startswith("annot_"): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
249 |
ensemble_parent.remove(ens) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
250 |
# remove in display nodes |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
251 |
if display_content_node is not None: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
252 |
for cut_display in display_content_node.iterchildren(): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
253 |
if cut_display.get('idens','') == ens_id: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
254 |
display_content_node.remove(cut_display) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
255 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
256 |
ensemble = None |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
257 |
elements = None |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
258 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
259 |
if self.merge: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
260 |
for ens in ensemble_parent.findall(u"ensemble"): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
261 |
if ens.get('id',"").startswith("annot_"): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
262 |
ensemble = ens |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
263 |
break |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
264 |
if ensemble is not None: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
265 |
elements = ensemble.find(u".//elements") |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
266 |
decoupage = ensemble.find(u"decoupage") |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
267 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
268 |
if ensemble is None or elements is None: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
269 |
ensemble = etree.SubElement(ensemble_parent, u"ensemble", {u"id":u"annot_" + unicode(uuid.uuid4()), u"title":u"Ensemble Annotation", u"author":u"IRI Web", u"abstract":u"Ensemble Annotation"}) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
270 |
decoupage = etree.SubElement(ensemble, u"decoupage", {u"id": unicode(uuid.uuid4()), u"author": u"IRI Web"}) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
271 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
272 |
etree.SubElement(decoupage, u"title").text = unicode(self.name) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
273 |
etree.SubElement(decoupage, u"abstract").text = unicode(self.name) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
274 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
275 |
elements = etree.SubElement(decoupage, u"elements") |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
276 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
277 |
ensemble_id = ensemble.get('id', '') |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
278 |
decoupage_id = decoupage.get('id', '') if decoupage is not None else None |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
279 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
280 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
281 |
filters = self.get_filter() |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
282 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
283 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
284 |
params = { 'q':json.dumps({'filters':filters}), 'results_per_page': self.batch_size} |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
285 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
286 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
287 |
for annot in self.build_annotation_iterator(params): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
288 |
annot_ts = self.parse_date(annot['ts']) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
289 |
if self.start_date is None: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
290 |
star_date = annot_ts |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
291 |
annot_ts_rel = annot_ts-self.start_date |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
292 |
annot_ts_rel_milli = int(round(annot_ts_rel.total_seconds()*1000)) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
293 |
d = self.find_delta(annot_ts_rel_milli) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
294 |
if d[1] < 0: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
295 |
continue |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
296 |
else : |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
297 |
annot_ts_rel_milli -= d[1] |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
298 |
annot_content = annot.get('content',{'category':'', 'user':None}) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
299 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
300 |
username = annot_content.get('user', 'anon.') or 'anon.' |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
301 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
302 |
category = annot_content.get('category', None) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
303 |
if category is None: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
304 |
continue |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
305 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
306 |
element = etree.SubElement(elements, u"element" , {u"id":annot.get('uuid', uuid.uuid4()), u"color":unicode(self.color), u"author":unicode(username), u"date":unicode(annot_ts.strftime("%Y/%m/%d")), u"begin": unicode(annot_ts_rel_milli), u"dur":u"0"}) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
307 |
etree.SubElement(element, u"title").text = unicode(username) + u": " + unicode(category.get('label', category.get('code', ''))) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
308 |
etree.SubElement(element, u"abstract").text = unicode(category.get('label', category.get('code', ''))) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
309 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
310 |
tags_node = etree.SubElement(element, u"tags") |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
311 |
etree.SubElement(tags_node,u"tag").text = category.get('code', '') |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
312 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
313 |
meta_element = etree.SubElement(element, u'meta') |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
314 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
315 |
polemics_element = etree.Element(u'polemics') |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
316 |
etree.SubElement(polemics_element, u'polemic').text = category.get('code', '') |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
317 |
meta_element.append(polemics_element) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
318 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
319 |
etree.SubElement(meta_element, u"source", attrib={"url":self.annot_url + "/" + annot['uuid'], "mimetype":u"application/json"}).text = etree.CDATA(json.dumps(annot)) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
320 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
321 |
# sort by tc in |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
322 |
if self.merge : |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
323 |
# remove all elements and put them in a array |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
324 |
# sort them with tc |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
325 |
#put them back |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
326 |
elements[:] = sorted(elements,key=lambda n: int(n.get('begin'))) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
327 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
328 |
#add to display node |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
329 |
if display_content_node is not None: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
330 |
display_dec = None |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
331 |
for dec in display_content_node.iterchildren(tag=u"decoupage"): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
332 |
if dec.get('idens','') == ensemble_id and dec.get('id', '') == decoupage_id: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
333 |
display_dec = dec |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
334 |
break |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
335 |
if display_dec is None and ensemble_id and decoupage_id: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
336 |
etree.SubElement(display_content_node, u"decoupage", attrib={'idens': ensemble_id, 'id': decoupage_id, 'tagsSelect':''}) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
337 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
338 |
output_data = etree.tostring(root, encoding="utf-8", method="xml", pretty_print=False, xml_declaration=True) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
339 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
340 |
if self.content_file_write and self.content_file_write.find("http://") == 0: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
341 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
342 |
project["ldt"] = output_data |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
343 |
project['owner'] = project['owner'].replace('%7E','~') |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
344 |
project['contents'] = [c_url.replace('%7E','~') for c_url in project['contents']] |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
345 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
346 |
self.logger.debug("write http " + self.content_file_write) #@UndefinedVariable |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
347 |
self.logger.debug("write http " + repr(self.post_param)) #@UndefinedVariable |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
348 |
self.logger.debug("write http " + repr(project)) #@UndefinedVariable |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
349 |
r = requests.put(self.content_file_write, data=json.dumps(project), headers={'content-type':'application/json'}, params=self.post_param); |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
350 |
self.logger.debug("write http " + repr(r) + " content " + r.text) #@UndefinedVariable |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
351 |
if r.status_code != requests.codes.ok: # @UndefinedVariable |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
352 |
r.raise_for_status() |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
353 |
else: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
354 |
if self.content_file_write and os.path.exists(self.content_file_write): |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
355 |
dest_file_name = self.content_file_write |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
356 |
else: |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
357 |
dest_file_name = self.filename |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
358 |
|
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
359 |
self.logger.debug("WRITE : " + dest_file_name) #@UndefinedVariable |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
360 |
output = open(dest_file_name, "w") |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
361 |
output.write(output_data) |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
362 |
output.flush() |
658561ea9e65
export sync code in utils, and add button to synchronize annotation on eventsessionview
ymh <ymh.work@gmail.com>
parents:
22
diff
changeset
|
363 |
output.close() |