src/core/import_processor.py
changeset 0 4095911a7830
child 28 5918a9d353d0
equal deleted inserted replaced
-1:000000000000 0:4095911a7830
       
     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