|
1 # -*- coding: utf-8 -*- |
|
2 ''' |
|
3 Created on Jun 10, 2013 |
|
4 |
|
5 @author: ymh |
|
6 ''' |
|
7 from .models import Term |
|
8 from .rdf_models import graph |
|
9 from dateutil import parser |
|
10 import re |
|
11 |
|
12 class ImportProcessor(object): |
|
13 |
|
14 def __init__(self, field): |
|
15 self.field = field |
|
16 |
|
17 def process(self, obj, value): |
|
18 return {} |
|
19 |
|
20 |
|
21 class CharFieldProcessor(ImportProcessor): |
|
22 |
|
23 def process(self, obj, value): |
|
24 setattr(obj, self.field, value) |
|
25 return {} |
|
26 |
|
27 class BooleanFieldProcessor(ImportProcessor): |
|
28 |
|
29 def process(self, obj, value): |
|
30 setattr(obj, self.field, value and value.strip().lower() in ['oui', '1', 't', 'yes', 'y', 'o']) |
|
31 |
|
32 class DateFieldProcessor(ImportProcessor): |
|
33 |
|
34 def process(self, obj, value): |
|
35 setattr(obj, self.field, parser.parse(value)) |
|
36 |
|
37 class TermProcessor(ImportProcessor): |
|
38 |
|
39 def __init__(self, field, context, notice_term_klass, re_split = "[;,:]", re_sub = "\(.+?\)"): |
|
40 ImportProcessor.__init__(self, field) |
|
41 self.re_split = re_split |
|
42 self.re_sub = re_sub |
|
43 self.context = context |
|
44 self.notice_term_klass = notice_term_klass |
|
45 |
|
46 def build_notice_term(self, token, obj): |
|
47 uri = graph.get_uri_for_term(token, context=self.context) |
|
48 if not uri: |
|
49 return None |
|
50 term_obj = Term.objects.get(uri=uri) |
|
51 if not self.notice_term_klass.objects.filter(notice=obj,term=term_obj).exists(): |
|
52 return self.notice_term_klass(notice=obj,term=term_obj) |
|
53 |
|
54 def process(self, obj, value): |
|
55 res = {} |
|
56 #remove everything between () |
|
57 value = getattr(obj, self.field) |
|
58 if self.re_sub: |
|
59 value = re.sub(self.re_sub, "", value) |
|
60 for token in re.split(self.re_split, value): |
|
61 token = token.strip() |
|
62 nt = self.build_notice_term(token, obj) |
|
63 if nt is not None: |
|
64 res.setdefault(self.notice_term_klass,[]).append(nt) |
|
65 |
|
66 return res |