Changeset 8599 for mauRepo/MolesManager


Ignore:
Timestamp:
02/10/12 16:21:44 (7 years ago)
Author:
mnagni
Message:

Complete - # 22554: "Remove the ""FollowSymLinks"""
 http://team.ceda.ac.uk/trac/ceda/ticket/22554
Incomplete - # 22563: Circular reference detected in citest dataset
 http://team.ceda.ac.uk/trac/ceda/ticket/22563

Location:
mauRepo/MolesManager/trunk/cedaMoles
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • mauRepo/MolesManager/trunk/cedaMoles/MolesManager/djencoder.py

    r8569 r8599  
    55''' 
    66from json.encoder import JSONEncoder 
    7 import re 
    87import logging 
    98import inspect 
     9import datetime 
     10import re 
     11from decimal import Decimal 
     12from inspect import isclass 
     13from sqlalchemy.orm.collections import InstrumentedList 
    1014 
    1115class DJEncoder(JSONEncoder): 
    1216 
     17    __PATTERN = re.compile('\D\D__*') 
     18    __PATTERN2 = re.compile('\A\w+__id\Z') 
    1319    log = logging.getLogger('DJEncoder') 
    14      
     20 
    1521    def __init__(self): 
    1622        self.__markers = {} 
    17         super(DJEncoder, self).__init__() 
    18         self.__pattern = re.compile('\D\D__*') 
    19         self.__pattern2 = re.compile('\A\w+__id\Z') 
     23        super(DJEncoder, self).__init__()  
     24 
     25    def default(self, obj): 
     26        d = {} 
     27 
     28        if isinstance(obj, datetime.datetime): 
     29            # wanted a simple yield str(o) in the next line, 
     30            # but that would mean a yield on the line with super(...), 
     31            # which wouldn't work (see my comment below), so... 
     32            return str(obj) 
    2033         
     34        if isinstance(obj, Decimal): 
     35            # wanted a simple yield str(o) in the next line, 
     36            # but that would mean a yield on the line with super(...), 
     37            # which wouldn't work (see my comment below), so... 
     38            return str(obj)  
    2139 
    22     def default(self, obj):        
    2340        # Convert objects to a dictionary of their representation 
    24         d = {} 
    2541        try: 
    2642            d = { '__module__':obj.__module__, 
     
    3652        if d['__module__'].startswith('sqlalchemy'): 
    3753            return d 
    38  
    39         if d['__class__'] == 'Decimal': 
    40             d.update({'value': str(obj)}) 
    41         else:     
    42             for key in obj.__dict__.keys(): 
    43                 if not (key.startswith("_") or self.__pattern.match(key) or self.__pattern2.match(key)): 
    44                     d.update({key: getattr(obj, key)}) 
     54   
     55        for key in obj.__dict__.keys(): 
     56            if not (key.startswith("_") \ 
     57                    or DJEncoder.__PATTERN.match(key) \ 
     58                    or DJEncoder.__PATTERN2.match(key)): 
     59                d.update({key: getattr(obj, key)}) 
    4560        getters = list(methodsWithDecorator(type(obj), "property")) 
    4661        for name in getters: 
    47             try: 
    48                 d.update({name: getattr(obj, name)}) 
    49             except Exception as e: 
    50                 DJEncoder.log.error(e) 
     62            if hasattr(obj, name): 
     63                try: 
     64                    d.update({name: getattr(obj, name)}) 
     65                except Exception as e: 
     66                    DJEncoder.log.error(e) 
    5167         
    5268        for key, value in d.items(): 
    53             if value is not None and id(value) in self.__markers and not isinstance(value, str) and not isinstance(value, int): 
    54                 continue 
    55                 #return {} 
    56             else: 
    57                 self.__markers[id(value)] = value 
    58                 if isinstance(value, str) or isinstance(value, unicode):                     
    59                     self.__markers[id(value)] = escapeForJSON(value) 
    60                 else: 
    61                     self.__markers[id(value)] = value 
     69            if value is not None: 
     70                if isinstance(value, list) or isinstance(value, InstrumentedList): 
     71                    for item in value: 
     72                        if id(item) in getattr(self, '_DJEncoder__markers'): 
     73                            d.pop(key) 
     74                            break 
     75                elif id(value) in getattr(self, '_DJEncoder__markers'): 
     76                    d.pop(key) 
    6277        return d 
     78 
     79    def iterencode(self, o): 
     80        """Encode the given object and yield each string representation as 
     81        available. 
     82 
     83        For example:: 
     84 
     85            for chunk in JSONEncoder().iterencode(bigobject): 
     86                mysocket.write(chunk) 
     87 
     88        """ 
     89        if self.check_circular and hasattr(self, '_DJEncoder__markers'): 
     90            markers = getattr(self, '_DJEncoder__markers') 
     91        else: 
     92            markers = None 
     93        return self._iterencode(o, markers) 
    6394 
    6495def methodsWithDecorator(cls, decoratorName): 
  • mauRepo/MolesManager/trunk/cedaMoles/MolesManager/views/cedaObservationView.py

    r8590 r8599  
    5151    context = {} 
    5252    if record: 
    53         context['coObs'] = encodeToJSON(record) 
     53        try: 
     54            context['coObs'] = encodeToJSON(record) 
     55        except Exception as e: 
     56            print e 
    5457         
    5558        context['new_coObs'] = encodeCedaMoles2Json(record) 
     
    5760        guid = request.moles3EPB.retrieveGUIDFromInstance(record) 
    5861        if guid: 
    59            context['guid'] = guid.id 
    60            print context['guid'] 
     62            context['guid'] = guid.id 
     63            print context['guid'] 
    6164        print context['coObs']  
     65        print context['new_coObs'] 
    6266         
    6367    return mm_render_to_response(request, context, 'cedaObservation.html') 
  • mauRepo/MolesManager/trunk/cedaMoles/libs/epb.py

    r8522 r8599  
    3535from sqlalchemy.orm.util import identity_key 
    3636from cedaMoles.MolesManager.djencoder import methodsWithDecorator 
     37from decimal import Decimal 
    3738 
    3839class EPB(object): 
     
    281282            or isinstance(obj, str) \ 
    282283            or isinstance(obj, int) \ 
    283             or isinstance(obj, unicode) 
     284            or isinstance(obj, unicode) \ 
     285            or isinstance(obj, Decimal) 
Note: See TracChangeset for help on using the changeset viewer.