rabin 7 years ago
parent
commit
9e1e48afb6
3 changed files with 254 additions and 239 deletions
  1. 4 4
      core.py
  2. 20 18
      service.py
  3. 230 217
      web.py

+ 4 - 4
core.py

@@ -144,18 +144,18 @@ class Demeter(object):
 		return salt
 
 	@staticmethod
-	def mktime(value):
+	def mktime(value, str='%Y-%m-%d %H:%M:%S'):
 		module = __import__('time')
 		strptime = getattr(module, 'strptime')
 		mktime = getattr(module, 'mktime')
-		return int(mktime(strptime(value,'%Y-%m-%d %H:%M:%S')))
+		return int(mktime(strptime(value,str)))
 
 	@staticmethod
-	def date(value):
+	def date(value, str='%Y-%m-%d %H:%M:%S'):
 		module = __import__('datetime')
 		datetime = getattr(module, 'datetime')
 		fromtimestamp = getattr(datetime, 'fromtimestamp')
-		return str(fromtimestamp(value).strftime('%Y-%m-%d %H:%M:%S'))
+		return str(fromtimestamp(value).strftime(str))
 
 	@staticmethod
 	def error(string):

+ 20 - 18
service.py

@@ -16,15 +16,16 @@ class Service(object):
 		if search:
 			for key, value in search.items():
 				if value:
-					key = key.split('-')
-					if hasattr(model, key[0]):
-						attr = getattr(model, key[0])
-						if hasattr(attr, key[2]):
+					if '-' in key:
+						key = key.split('-')
+						keyLen = len(key)
+						if keyLen > 2 and key[2]:
 							method = key[2]
 						else:
 							method = 'assgin'
-						func = getattr(attr, method)
-						func(value)
+						self.assgin(model, key[0], value, method)
+					else:
+						self.assgin(model, key, value)
 		data = model.select(page=page)
 		return data
 
@@ -33,10 +34,7 @@ class Service(object):
 		model = self.model(name)
 		if kwd:
 			for key,value in kwd.items():
-				if hasattr(model, key):
-					attr = getattr(model, key)
-					func = getattr(attr, 'assgin')
-					func(value)
+				self.assgin(model, key, value)
 		data = model.select(type='fetchone')
 		return data
 
@@ -51,13 +49,10 @@ class Service(object):
 			return id
 		else:
 			for key, value in data.items():
-				if hasattr(model, key):
-					attr = getattr(model, key)
-					method = 'assgin'
-					if 'date' in key:
-						method = 'time'
-					func = getattr(attr, method)
-					func(value)
+				method = 'assgin'
+				if 'date' in key:
+					method = 'time'
+				self.assgin(model, key, value, method)
 			return model.insert()
 
 	# 删除
@@ -67,4 +62,11 @@ class Service(object):
 		return model.update(state=state)
 
 	def model(self, name):
-		return Demeter.model(name)
+		return Demeter.model(name)
+
+	def assgin(self, model, key, value, method='assgin'):
+		if hasattr(model, key):
+			attr = getattr(model, key)
+			if hasattr(attr, method):
+				call = getattr(attr, method)
+				call(value)

+ 230 - 217
web.py

@@ -1,9 +1,9 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 """
-    demeter web
-    name:application.py
-    author:rabin
+	demeter web
+	name:application.py
+	author:rabin
 """
 import os
 import json
@@ -13,219 +13,232 @@ import tornado.ioloop
 import tornado.httpserver
 
 class Base(tornado.web.RequestHandler):
-    def initialize(self):
-        self.data = {}
-        self.page()
-        self.search()
-        self.cookie()
-        self.setting()
-        self.assign()
-
-    def get_current_user(self):
-        return self.get_secure_cookie(self.KEYS[1])
-
-    def assign(self):
-        self.data['setting'] = Demeter.config['setting']
-        
-    def cookie(self):
-        for key in self.KEYS:
-            cookie = None
-            if key in Demeter.config['base']:
-                cookie = Demeter.config['base'][key]
-            if not cookie:
-                cookie = self.get_secure_cookie(key)
-                #cookie = self.get_cookie(key)
-            if not cookie:
-                value = self.input(key)
-                if value:
-                    #self.set_secure_cookie(key, value)
-                    Demeter.config['setting'][key] = value
-                else:
-                    Demeter.config['setting'][key] = 0
-            else:
-                Demeter.config['setting'][key] = cookie
-
-    def page(self):
-        Demeter.config['page'] = {}
-        page = self.input('page')
-        if page:
-            Demeter.config['page']['ajax'] = True
-        else:
-            Demeter.config['page']['ajax'] = False
-            page = 1
-        Demeter.config['page']['current'] = page
-        Demeter.config['page']['total'] = 0
-        self.data['page'] = Demeter.config['page']
-
-    def search(self):
-        data = self.request.arguments
-        self.data['search'] = {}
-        self.data['update'] = {}
-        for key in data:
-            if 'search_' in key:
-                index = key.replace('search_', '')
-                self.data['search'][index] = ",".join(data[key])
-            if 'update_' in key:
-                index = key.replace('update_', '')
-                self.data['update'][index] = ",".join(data[key])
-
-    def input(self, key, value=None):
-        return self.get_argument(key, value)
-
-    def service(self, name):
-        return Demeter.service(name)
-
-    def model(self, name):
-        return Demeter.model(name)
-
-    def common(self, **kwd):
-        self.data['common'] = kwd
-        farm = str(Demeter.config['setting']['farm'])
-        self.data['common']['argvs'] = '&farm=' + farm + '&search_farm_id-select-=' + farm
-
-    def commonView(self, name):
-        self.view('common/'+name+'.html')
-
-    def commonList(self, model):
-        self.data['state'] = self.input('state', True)
-        self.data['list'] = self.service('common').list(model, state=self.data['state'], search=self.data['search'], page=True)
-
-    def commonOne(self, model, **kwd):
-        id = self.input('id')
-        self.data['info'] = {}
-        if id:
-            kwd['id'] = id
-        if kwd:
-            self.data['info'] = self.service('common').one(model, **kwd)
-        if not self.data['info'] and Demeter.config['setting']['farm'] > 0:
-            self.data['info']['farm_id'] = Demeter.config['setting']['farm']
-
-    def commonUpdate(self, model, msg='', id=0, **kwd):
-        if not self.data['auth']:
-            self.auth()
-        else:
-            if id <= 0:
-                id = self.input('id')
-            if kwd:
-                info = self.service('common').one(model, **kwd)
-                if id:
-                    id = int(id)
-                if info and (id != info['id']):
-                    self.out(msg)
-                    return
-            state = self.service('common').update(model, id, self.data['update'])
-            self.log(model, 'update', self.data['update'])
-            self.out('yes', {'id':state})
-            return state
-
-    def commonDelete(self, model):
-        if not self.data['auth']:
-            self.auth()
-        else:
-            id = self.input('id')
-            state = self.input('state', False)
-            state = self.service('common').delete(model, id, state)
-            self.log(model, 'delete', {id:id, state:state})
-            self.out('yes', {'state':state})
-
-    def log(self, model, method, data):
-        insert = {}
-        insert['admin_id'] = Demeter.config['setting']['admin']
-        insert['model'] = model
-        insert['method'] = method
-        insert['data'] = json.dumps(data)
-        self.service('common').update('manage_log', None, insert)
-
-    def view(self, name):
-        if not self.data['auth']:
-            self.auth()
-        else:
-            self.render(name, data=self.data)
-
-    def auth(self):
-        self.out('您没有权限')
-
-    def out(self, msg='', data={}, code=0):
-        callback = self.input('callback')
-        function = self.input('function')
-        result = ''
-        send = {}
-        send['status'] = 1
-        send['msg'] = msg
-        send['data'] = data
-        send['code'] = code
-        if not send['data']:
-            send['status'] = 2
-        result = json.dumps(send)
-        if callback:
-            result = callback + '(' + result + ')'
-        elif function:
-            result = '<script>parent.' + function + '(' + result + ')' + '</script>';
-        self.write(result)
-        #self.finish(result)
+	def initialize(self):
+		self.data = {}
+		self.page()
+		self.cookie()
+		self.setting()
+		self.assign()
+
+	def get_current_user(self):
+		return self.get_secure_cookie(self.KEYS[0])
+
+	def assign(self):
+		self.data['setting'] = Demeter.config['setting']
+		
+	def cookie(self):
+		for key in self.KEYS:
+			cookie = None
+			if key in Demeter.config['base']:
+				cookie = Demeter.config['base'][key]
+			if not cookie:
+				cookie = self.get_secure_cookie(key)
+				#cookie = self.get_cookie(key)
+			if not cookie:
+				value = self.input(key)
+				if value:
+					#self.set_secure_cookie(key, value)
+					Demeter.config['setting'][key] = value
+				else:
+					Demeter.config['setting'][key] = 0
+			else:
+				Demeter.config['setting'][key] = cookie
+
+	def page(self):
+		Demeter.config['page'] = {}
+		page = self.input('page')
+		if page:
+			Demeter.config['page']['ajax'] = True
+		else:
+			Demeter.config['page']['ajax'] = False
+			page = 1
+		Demeter.config['page']['current'] = page
+		Demeter.config['page']['total'] = 0
+		self.data['page'] = Demeter.config['page']
+
+	def search(self):
+		data = self.request.arguments
+		self.data['search'] = {}
+		self.data['update'] = {}
+		for key in data:
+			if 'search_' in key:
+				index = key.replace('search_', '')
+				self.data['search'][index] = ",".join(data[key])
+			if 'update_' in key:
+				index = key.replace('update_', '')
+				self.data['update'][index] = ",".join(data[key])
+
+	def input(self, key, value=None):
+		return self.get_argument(key, value)
+
+	def service(self, name):
+		return Demeter.service(name)
+
+	def model(self, name):
+		return Demeter.model(name)
+
+	def common(self, **kwd):
+		self.data['common'] = kwd
+		self.data['common']['argvs'] = ''
+		if Demeter.config['setting']['farm'] > 0:
+			farm = str(Demeter.config['setting']['farm'])
+			self.data['common']['argvs'] = '&farm=' + farm + '&search_farm_id-select-=' + farm
+
+	def commonView(self, name):
+		self.view('common/'+name+'.html')
+
+	def commonList(self, model):
+		self.data['state'] = self.input('state', True)
+		self.data['list'] = self.service('common').list(model, state=self.data['state'], search=self.data['search'], page=True)
+
+	def commonOne(self, model, **kwd):
+		id = self.input('id')
+		self.data['info'] = {}
+		if id:
+			kwd['id'] = id
+		if kwd:
+			self.data['info'] = self.service('common').one(model, **kwd)
+		if not self.data['info'] and Demeter.config['setting']['farm'] > 0:
+			self.data['info']['farm_id'] = Demeter.config['setting']['farm']
+
+	def commonUpdate(self, model, msg='', id=0, **kwd):
+		if not self.data['auth']:
+			self.auth()
+		else:
+			if id <= 0:
+				id = self.input('id')
+			if kwd:
+				info = self.service('common').one(model, **kwd)
+				if id:
+					id = int(id)
+				if info and (id != info['id']):
+					self.out(msg)
+					return
+			state = self.service('common').update(model, id, self.data['update'])
+			self.log(model, 'update', self.data['update'])
+			self.out('yes', {'id':state})
+			return state
+
+	def commonDelete(self, model):
+		if not self.data['auth']:
+			self.auth()
+		else:
+			id = self.input('id')
+			state = self.input('state', False)
+			state = self.service('common').delete(model, id, state)
+			self.log(model, 'delete', {id:id, state:state})
+			self.out('yes', {'state':state})
+
+	def log(self, model, method, data):
+		if 'admin' in Demeter.config['setting'] and Demeter.config['setting']['admin'] > 0:
+			insert = {}
+			insert['admin_id'] = Demeter.config['setting']['admin']
+			insert['model'] = model
+			insert['method'] = method
+			insert['data'] = json.dumps(data)
+			self.service('common').update('manage_log', None, insert)
+
+	def view(self, name):
+		if not self.data['auth']:
+			self.auth()
+		else:
+			self.render(name, data=self.data)
+
+	def auth(self):
+		self.out('您没有权限')
+
+	def out(self, msg='', data={}, code=0):
+		if data:
+			if 'page' in data and data['page']['total'] <= 0:
+				del data['page']
+			if 'update' in data and not data['update']:
+				del data['update']
+			if 'search' in data and not data['search']:
+				del data['search']
+		callback = self.input('callback')
+		function = self.input('function')
+		result = ''
+		send = {}
+		send['status'] = 1
+		send['msg'] = msg
+		send['data'] = data
+		send['code'] = code
+		if not send['data']:
+			send['status'] = 2
+		result = json.dumps(send)
+		if callback:
+			result = callback + '(' + result + ')'
+		elif function:
+			result = '<script>parent.' + function + '(' + result + ')' + '</script>';
+		self.write(result)
+		#self.finish(result)
 
 class Web(object):
-    @staticmethod
-    def file(path):
-        files = os.listdir(path)
-        result = []
-        for key in files:
-            if '.DS_Store' not in key and  '__' not in key and 'pyc' not in key:
-                key = key.replace('.py', '')
-                result.append(key)
-        return result
-    @staticmethod
-    def url(module, key, url):
-        str = dir(module)
-        for i in str:
-            act = ''
-            if '_path' in i:
-                act = i.replace('_path', '')
-            if '_html' in i:
-                act = i.replace('_html', '.html')
-            if act:
-                attr = getattr(module, i)
-                if key == 'main' and act == 'index':
-                    url.append((r'/', attr))
-                elif key == act:
-                    url.append((r'/'+act, attr))
-                url.append((r'/'+key+'/'+act, attr))
-        return url
-    @staticmethod
-    def start(url):
-        config = Demeter.config[Demeter.web]
-        settings = {
-            "static_path": Demeter.webPath + 'static',
-            "template_path": Demeter.webPath + 'templates',
-            "cookie_secret": "61oETzKXQAGaYekL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=",
-            "login_url": "/user/login",
-            "xsrf_cookies": True,
-            "debug": Demeter.bool(config['debug']),
-            #"autoreload": Demeter.bool(config['autoreload']),
-            "port": config['port'],
-            "max_buffer_size": int(config['max_buffer_size']),
-            "process": int(config['process'])
-        }
-        handlers = []
-        def application_setting():
-            handlers.append((r"/upload/(.*)", tornado.web.StaticFileHandler, {"path": Demeter.path + 'runtime/upload/'}))
-            handlers.append((r"/static/(.*)", tornado.web.StaticFileHandler, {"path":"static"}))
-            handlers.append((r"/(apple-touch-icon\.png)", tornado.web.StaticFileHandler, dict(path=settings['static_path'])))
-            handlers.extend(url)
-
-        application_setting()
-        application = tornado.web.Application(handlers=handlers, **settings)
-        
-        if settings['debug'] == True:
-            application.listen(settings['port'])
-            tornado.ioloop.IOLoop.instance().start()
-        else:
-            server = tornado.httpserver.HTTPServer(application, settings['max_buffer_size'])
-            server.bind(settings['port'])
-            server.start(settings['process'])
-            try:        
-                print 'running on port %s' % settings['port']
-                tornado.ioloop.IOLoop.instance().start()
-
-            except KeyboardInterrupt:
-                tornado.ioloop.IOLoop.instance().stop()
+	@staticmethod
+	def auth(method):
+		return tornado.web.authenticated(method)
+		
+	@staticmethod
+	def file(path):
+		files = os.listdir(path)
+		result = []
+		for key in files:
+			if '.DS_Store' not in key and  '__' not in key and 'pyc' not in key:
+				key = key.replace('.py', '')
+				result.append(key)
+		return result
+	@staticmethod
+	def url(module, key, url):
+		str = dir(module)
+		for i in str:
+			act = ''
+			if '_path' in i:
+				act = i.replace('_path', '')
+			if '_html' in i:
+				act = i.replace('_html', '.html')
+			if act:
+				attr = getattr(module, i)
+				if key == 'main' and act == 'index':
+					url.append((r'/', attr))
+				elif key == act or act == 'index':
+					url.append((r'/'+key, attr))
+				url.append((r'/'+key+'/'+act, attr))
+		return url
+	@staticmethod
+	def start(url):
+		config = Demeter.config[Demeter.web]
+		settings = {
+			"static_path": Demeter.webPath + 'static',
+			"template_path": Demeter.webPath + 'templates',
+			"cookie_secret": "61oETzKXQAGaYekL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=",
+			"login_url": "/user/login",
+			"xsrf_cookies": True,
+			"debug": Demeter.bool(config['debug']),
+			#"autoreload": Demeter.bool(config['autoreload']),
+			"port": config['port'],
+			"max_buffer_size": int(config['max_buffer_size']),
+			"process": int(config['process'])
+		}
+		handlers = []
+		def application_setting():
+			handlers.append((r"/upload/(.*)", tornado.web.StaticFileHandler, {"path": Demeter.path + 'runtime/upload/'}))
+			handlers.append((r"/static/(.*)", tornado.web.StaticFileHandler, {"path":"static"}))
+			handlers.append((r"/(apple-touch-icon\.png)", tornado.web.StaticFileHandler, dict(path=settings['static_path'])))
+			handlers.extend(url)
+
+		application_setting()
+		application = tornado.web.Application(handlers=handlers, **settings)
+		
+		if settings['debug'] == True:
+			application.listen(settings['port'])
+			tornado.ioloop.IOLoop.instance().start()
+		else:
+			server = tornado.httpserver.HTTPServer(application, settings['max_buffer_size'])
+			server.bind(settings['port'])
+			server.start(settings['process'])
+			try:		
+				print 'running on port %s' % settings['port']
+				tornado.ioloop.IOLoop.instance().start()
+
+			except KeyboardInterrupt:
+				tornado.ioloop.IOLoop.instance().stop()