source: mauRepo/MolesManager/trunk/src/MolesManager/djencoder.py @ 8200

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/mauRepo/MolesManager/trunk/src/MolesManager/djencoder.py@8200
Revision 8200, 1.7 KB checked in by mnagni, 8 years ago (diff)

Complete - # 22390: AMEND MOLES2 -> CEDA Moles Author and Co-author migration (plus PI assignment) to CEDA Observation record
 http://team.ceda.ac.uk/trac/ceda/ticket/22390

RevLine 
[8088]1'''
2Created on 9 Feb 2012
3
4@author: mnagni
5'''
6from json.encoder import JSONEncoder
7from MolesManager.forms.date import methodsWithDecorator
[8143]8import re
[8088]9
10class DJEncoder(JSONEncoder):
[8143]11
[8088]12   
13    def __init__(self):
14        self.__markers = {}
15        super(DJEncoder, self).__init__()
[8143]16        self.__pattern = re.compile('\D\D__*')
17        self.__pattern2 = re.compile('\A\w+__id\Z')
18       
19
[8088]20   
21    def default(self, obj):
22        # Convert objects to a dictionary of their representation
23        d = { '__module__':obj.__module__,
24              }
25        if obj.__class__.__name__ == 'EnumSymbol':
26            d['__class__'] = obj._cls.__name__
27        else:
28            d['__class__'] = obj.__class__.__name__
29           
30        if d['__module__'].startswith('sqlalchemy'):
31            return d
[8182]32
33        if d['__class__'] == 'Decimal':
34            d.update({'value': str(obj)})
35        else:   
36            for key in obj.__dict__.keys():
37                if not (key.startswith("_") or self.__pattern.match(key) or self.__pattern2.match(key)):
38                    d.update({key: getattr(obj, key)})
[8088]39        getters = list(methodsWithDecorator(type(obj), "property"))
40        for name in getters:
41            d.update({name: getattr(obj, name)})
42       
43        for key, value in d.items():
44            if value is not None and id(value) in self.__markers and not isinstance(value, str) and not isinstance(value, int):
45                return {}
46            else:
47                self.__markers[id(value)] = value               
[8200]48        return d
49   
50    @classmethod
51    def escapeForJSON(self, toEscape):
52        res = toEscape.replace("'", "'")
53        #res = res.replace('"', '\\"')
54        res = res.replace('\\', '\\\\')
55        return res
56       
Note: See TracBrowser for help on using the repository browser.