view ikweb/ikweb/plugins/ikariam/__init__.py @ 247:7747bbe5b68e

start to develope Information Exchange Center of Ikariam Game. (prototpye)
author "Hisn Yi, Chen <ossug.hychen@gmail.com>"
date Mon, 01 Dec 2008 00:27:22 +0800
parents
children
line wrap: on
line source

def load_model(modelname):
    try:
        return eval(modelname)
    except NameError:
        module = __import__("model.%s" % modelname.lower(), {}, {}, [modelname])
        return getattr(module,modelname)
        
class IkariamModelPlugin:
    
    server = "s4"
    base_url = "http://%s.ikariam.tw" % server
    
    @classmethod
    def get_by_gameid(cls, id):
        obj = cls.gql("WHERE game_id ="+str(id)+" ORDER BY lastupdate_at").get()
        return obj
    
    def _mk_attrs(self):
        from copy import copy
        attrs = copy(self.params)
        
        for ref_name in ref_attrs:
            try:
                modelname = self.params[ref_name].replace('_id','')
                model = load_model(modelname)
                obj = model.get_by_game_id(self.params[ref_name])            
                attrs[modelname] = obj
            except KeyError:
                pass
        
        return self._tr_attrtype(attrs, 'int', int_attrs)    

class IkaraimControllerPlugin:

    def _get_modelname(self):
        return self.__class__.__name__.replace('Controller','')

    def attrs(self):                       
        modelname = self._get_modelname()
        model = load_model(modelname)
        
        def fn(e):
            if e not in getattr(model, 'unshow_attrs', []) and \
               e not in ['__module__','__doc__','_properties',
                         'unshow_attrs', 'int_attrs', 'lastupdate_at']:
                return e
        
        self.ui().render_result(200, '<br/>'.join(filter(fn, model.__dict__.keys())))

    def show(self):
        datas = self._get_modeldatas()
        
        content = []        
        for k,v in datas.items():
            content.append("%s:%s<br/>"%(k,v))
        
        self.ui().render_result(200, ''.join(content))
    
    def json(self):
        datas = self._get_modeldatas()
        self.ui().render_json_of(datas)
  
    def _get_modeldatas(self):
        modelname = self._get_modelname()
        model = load_model(modelname)
        obj = model.get_by_gameid(self.params['id'])  
        return self._tr_attrtype(obj._entity,'str')
    
    def create(self):
        self._update('create')

    def edit(self):
        self._update('edit')
        
    def _update(self, mode='create'):
        modelname = self._get_modelname()
        model = load_model(modelname)
        
        if 'edit' == mode:
            obj = model.get_by_gameid(self.params['game_id'])
        else:
            obj = model
        attrs = self._mk_attrs()
        obj.update_attributes(attrs)
        obj.save()  
        
    def _tr_attrtype(self, attrs, type, include_attrs=None):
        
        if not include_attrs:
            attrnames = attrs.keys()
        else:
            attrnames = include_attrs    
        
        for attrname in attrnames:
            try:
                attrs[attrname] = eval(type)(attrs[attrname])
            except KeyError:
                pass
        return attrs        

from gaeo.model import BaseModel
BaseModel.__bases__ += (IkariamModelPlugin,)

from gaeo.controller import BaseController
BaseController.__bases__ += (IkaraimControllerPlugin,)