diff options
| author | Pepper <pepper@scannerjammer.com> | 2015-11-26 16:26:53 -0500 |
|---|---|---|
| committer | Pepper <pepper@scannerjammer.com> | 2015-11-26 16:26:53 -0500 |
| commit | 9f6503ebcb20ac2621cd5b0defbb4a20716faf18 (patch) | |
| tree | e7b1aa36dd8e52ae37964740a7c27e4f30a9beff | |
| parent | 4bdd7d6891e84289502a8f619e338a3672707ea0 (diff) | |
rewrote db methods to MVC style
| -rw-r--r-- | controller_stuff | 29 | ||||
| -rw-r--r-- | photoblaster/db/__init__.py | 102 | ||||
| -rw-r--r-- | photoblaster/db/models/__init__.py | 54 | ||||
| -rw-r--r-- | photoblaster/db/models/iasdfus.py | 9 | ||||
| -rw-r--r-- | photoblaster/db/models/imcmd.py | 45 | ||||
| -rw-r--r-- | photoblaster/db/s3.py | 36 | ||||
| -rw-r--r-- | photoblaster/modules/base.py | 14 | ||||
| -rwxr-xr-x | photoblaster/modules/pbgradient.py | 35 | ||||
| -rwxr-xr-x | photoblaster/modules/pblandscape/__init__.py | 2 | ||||
| -rw-r--r-- | run_module_examples.py | 9 |
10 files changed, 144 insertions, 191 deletions
diff --git a/controller_stuff b/controller_stuff new file mode 100644 index 0000000..f945b63 --- /dev/null +++ b/controller_stuff @@ -0,0 +1,29 @@ +def insert_new_from_log(self, **kwargs): + try: + session = self.Session() + entry_data = { + 'last_accessed': kwargs["last_accessed"], + 'address': kwargs['address'], + 'times_accessed': 1, + 'times_dumped': 0, + 'deleted': 0 + } + session.add(Iasdfus(**entry_data)) + session.commit() + session.close() + except Exception as e: + self.log_error("Unable to commit database entry") + self.log_error(str(e)) + + def update_existing(self, last_accessed=None, address=None, logfile=None): + session = self.Session() + results = session.query(Iasdfus).filter_by(**{'address': address}) + if results.count() == 0: + session.close() + return False + if last_accessed > results[0].last_accessed: + results.update({"last_accessed": last_accessed}) + results.update({"times_accessed": results[0].times_accessed + 1}) + session.commit() + session.close() + return True diff --git a/photoblaster/db/__init__.py b/photoblaster/db/__init__.py index 92c8cd6..c720869 100644 --- a/photoblaster/db/__init__.py +++ b/photoblaster/db/__init__.py @@ -1,96 +1,14 @@ -# coding: utf-8 -"""Db bass class for updating the photoblaster database""" -from photoblaster.db.models import Iasdfus, ImCmd -import sys -from photoblaster.config import DB_HOST, DB_USER, DB_PASSWORD, DB_NAME from sqlalchemy import create_engine -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import sessionmaker -import simplejson as json -from sqlalchemy import sql, func, desc - - -_NULL = sql.null() -Base = declarative_base() -metadata = Base.metadata - - -class _DbSess(object): - """base controller for all db methods""" - def __init__(self): - """initializes the connection to mysql""" - engine = create_engine('mysql://{}:{}@{}/{}'.format( - DB_USER, - DB_PASSWORD, - DB_HOST, - DB_NAME - )) - self.Session = sessionmaker(bind=engine) - - def log_error(self, msg): - sys.stderr.write("DB error message: %s\n" % msg) - - - -class Pb(_DbSess): - """all photoblaster db methods go here""" - def __init__(self): - super(_DbSess, self).__init__() - - def search(self, **kwargs): - session = self.Session() - results = session.query(ImCmd).filter_by(**kwargs).all() - session.close() - return map( - lambda n: {"tag": n.tag, "data": json.loads(n.dataobj)}, results) - - def create(self, **kwargs): - try: - session = self.Session() - session.add(ImCmd(**kwargs)) - session.commit() - session.close() - except Exception as e: - self.log_error("Unable to commit database entry") - self.log_error(str(e)) +from sqlalchemy.orm import sessionmaker, scoped_session +from photoblaster.config import DB_HOST, DB_USER, DB_PASSWORD, DB_NAME - def _get( - self, - columns=None, - filter_by={}, - order_by=None, - offset=0, - limit=20, - not_deleted=False - ): - session = self.Session() - results = session.query(ImCmd) - if not_deleted: - filter_by['deleted'] = 0 - if filter_by: - results = results.filter_by(filter_by) - if order_by is not None: - results = results.order_by(order_by) - results = results.offset(offset).limit(limit) - session.close() - return [result.serialize(columns=columns) for result in results] - def get_random( - self, filter_by={}, - offset=0, limit=20, columns=None - ): - return self._get( - columns=columns, order_by=func.random(), - offset=offset, limit=limit) +engine = create_engine('mysql://{}:{}@{}/{}'.format( + DB_USER, + DB_PASSWORD, + DB_HOST, + DB_NAME +)) - def get_by_date( - self, - filter_by={}, - offset=0, limit=20, columns=None - ): - return self._get( - columns=columns, offset=offset, limit=limit, - order_by=desc( - ImCmd.date - ) - ) +session_factory = sessionmaker(bind=engine) +SessionHeap = scoped_session(session_factory) diff --git a/photoblaster/db/models/__init__.py b/photoblaster/db/models/__init__.py index 66f3fa2..07f0cfe 100644 --- a/photoblaster/db/models/__init__.py +++ b/photoblaster/db/models/__init__.py @@ -1,2 +1,52 @@ -from photoblaster.db.models.imcmd import ImCmd -from photoblaster.db.models.iasdfus import Iasdfus +from photoblaster.db import SessionHeap +from sqlalchemy import inspect +from sqlalchemy.ext.declarative import declarative_base + + +Base = declarative_base() + + +class Actions(object): + @classmethod + def create(cls, **kwargs): + session = SessionHeap() + session.add(cls(**kwargs)) + session.commit() + SessionHeap.remove() + + def update(self, **kwargs): + for key,val in kwargs.iteritems(): + self.__setattr__(key, val) + session = inspect(self).session + session.commit() + + @classmethod + def resultset(cls, **kwargs): + return ModelResultSet(SessionHeap(), cls) + + +class ModelResultSet(object): + def __init__(self, session, cls): + self.session = session + self.cls = cls + + def __del__(self): + self.session.close() + SessionHeap.remove() + + def search( + self, + filter_by={}, + order_by=None, + offset=0, + limit=20, + not_deleted=False + ): + results = self.session.query(self.cls) + if not_deleted: + filter_by['deleted'] = 0 + if filter_by: + results = results.filter_by(filter_by) + if order_by is not None: + results = results.order_by(order_by) + return results.offset(offset).limit(limit) diff --git a/photoblaster/db/models/iasdfus.py b/photoblaster/db/models/iasdfus.py index 63def26..89161e7 100644 --- a/photoblaster/db/models/iasdfus.py +++ b/photoblaster/db/models/iasdfus.py @@ -1,11 +1,9 @@ # coding: utf-8 """table class for iasdfus""" from sqlalchemy import BigInteger, Column, Integer, String -from sqlalchemy.ext.declarative import declarative_base +from photoblaster.db.models import Base, Actions -Base = declarative_base() - -class Iasdfus(Base): +class Iasdfus(Base, Actions): __tablename__ = 'iasdfus' id = Column(BigInteger, primary_key=True) @@ -14,3 +12,6 @@ class Iasdfus(Base): times_dumped = Column(Integer) times_accessed = Column(Integer) deleted = Column(Integer) + + + diff --git a/photoblaster/db/models/imcmd.py b/photoblaster/db/models/imcmd.py index 91b4460..e41abea 100644 --- a/photoblaster/db/models/imcmd.py +++ b/photoblaster/db/models/imcmd.py @@ -1,14 +1,13 @@ +# coding: utf-8 """describes the ImCmd class""" -import sys from sqlalchemy import Column, Integer, LargeBinary, String +from photoblaster.db.models import Base, Actions + import simplejson as json from sqlalchemy.orm import class_mapper -from sqlalchemy.ext.declarative import declarative_base - -Base = declarative_base() -class ImCmd(Base): +class ImCmd(Base, Actions): """defines the table class""" __tablename__ = 'im_cmd' id = Column(Integer, primary_key=True) @@ -22,25 +21,23 @@ class ImCmd(Base): cmd = Column(LargeBinary) dataobj = Column(LargeBinary) tag = Column(String(50)) - - def serialize(self, columns=None): - """returns the class as a dictionary""" - if not columns: - columns = [c.key for c in class_mapper(self.__class__).columns] - col_val = [] - for c in columns: + + + def as_dict(self): + """returns the class as a dictionary + + dataobj is a nested json object that contains more data about the command. + It was made due to poor initial planning, this unpacks it. + """ + column_names = [c.key for c in class_mapper(self.__class__).columns] + new_dict = {} + for c in column_names: if c == "dataobj": - val = getattr(self, c) + val = self.__getattr__(c) + if val is not None: - try: - val = json.loads(val) - except json.JSONDecodeError: - sys.stderr.write("Could not decode json: %s\n" % val) - sys.stderr.write( - "bad value in db, id = %s\n" % getattr(self, "id") - ) - pass - col_val.append((c, val)) + val = json.loads(val) + new_dict[c] = val else: - col_val.append((c, getattr(self, c))) - return dict(col_val) + new_dict[c] = self.__getattr__(c) + return new_dict diff --git a/photoblaster/db/s3.py b/photoblaster/db/s3.py deleted file mode 100644 index 7231000..0000000 --- a/photoblaster/db/s3.py +++ /dev/null @@ -1,36 +0,0 @@ - -class S3(_DbSess): - """queries the db for s3 related stuff""" - def __init__(self): - super(S3, self).__init__() - - def update_existing(self, last_accessed=None, address=None, logfile=None): - session = self.Session() - results = session.query(Iasdfus).filter_by(**{'address': address}) - if results.count() == 0: - session.close() - return False - if last_accessed > results[0].last_accessed: - results.update({"last_accessed": last_accessed}) - results.update({"times_accessed": results[0].times_accessed + 1}) - session.commit() - session.close() - return True - - def insert_new_from_log(self, **kwargs): - try: - session = self.Session() - entry_data = { - 'last_accessed': kwargs["last_accessed"], - 'address': kwargs['address'], - 'times_accessed': 1, - 'times_dumped': 0, - 'deleted': 0 - } - session.add(Iasdfus(**entry_data)) - session.commit() - session.close() - except Exception as e: - self.log_error("Unable to commit database entry") - self.log_error(str(e)) - diff --git a/photoblaster/modules/base.py b/photoblaster/modules/base.py index 70cc76c..9e76bcb 100644 --- a/photoblaster/modules/base.py +++ b/photoblaster/modules/base.py @@ -14,7 +14,7 @@ from photoblaster.params import Params import sha import simplejson as json from photoblaster.s3.cli import S3Cli -from photoblaster.db.pb import Pb as DbPb +from photoblaster.db.models.imcmd import ImCmd BASE_URL = "http://i.asdf.us" _MAX_FILENAME_LENGTH = 20 @@ -186,25 +186,19 @@ class Pb(object): def db_send(self, remote_addr=None, db_connection=None): try: - db = db_connection or DbPb() - except Exception as e: - sys.stderr.write("Could not connect to db:\n{}".format(e)) - sys.exit(1) - try: - _insert_data = { 'date': self._now, 'remote_addr': remote_addr, - 'username': str(self.params.username), + 'name': str(self.params.username), 'url': self._db_url_param, - 'directory': self._hashdir, + 'dir': self._hashdir, 'oldfile': None, 'newfile': self.filename, 'dataobj': json.dumps(dict(self._input_kwargs)), 'cmd': "; ".join(self.commands), 'tag': self.tag, } - db.insert_cmd(**_insert_data) + ImCmd.create(**_insert_data) except Exception as e: self.err_warn("Problem sending to database:\n %s" % str(e)) diff --git a/photoblaster/modules/pbgradient.py b/photoblaster/modules/pbgradient.py index cef2518..9b8ecaf 100755 --- a/photoblaster/modules/pbgradient.py +++ b/photoblaster/modules/pbgradient.py @@ -20,24 +20,23 @@ _halftone_values = { }
class PbGradient(Pb):
- example_params = {'username': 'RICHARD_GIOVANNI', 'bevel': 'flatinner', 'saturation': '', 'rotate': 34, 'percentbeveled': 96, 'brightness': 79, 'stripenumber': 2, 'filetype': 'png', 'blurriness': 180, 'flip': '', 'height': 594, 'color1': 'rgb(191,125,24)', 'width': 536, 'color2': 'rgb(186,78,94)', 'gradienttype': 'mirrored', 'stripeintensity': 2515, 'tilt': 58, 'flop': '', 'halftone': 'etchedtransition', 'hue': 146}
-# example_params = {
-# "width" : "200",
-# "color1" : "#ffdead",
-# "color2" : "blue",
-# "stripes" : "true",
-# "stripenumber" : "20",
-# "gradienttype" : "radial",
-# "stripeintensity" : "20",
-# "halftone" : "checkeredfade",
-# "percentbeveled" : "30",
-# "flip" : "true",
-# "bevel" : "flatinner",
-# "rotate" : "20",
-# "height" : "200",
-# "filetype" : "jpg",
-# "username" : "whatever"
-# }
+ example_params = {
+ "width" : "200",
+ "color1" : "#ffdead",
+ "color2" : "blue",
+ "stripes" : "true",
+ "stripenumber" : "20",
+ "gradienttype" : "plasma",
+ "stripeintensity" : "20",
+ "halftone" : "checkeredfade",
+ "percentbeveled" : "30",
+ "flip" : "true",
+ "bevel" : "flatinner",
+ "rotate" : "20",
+ "height" : "200",
+ "filetype" : "jpg",
+ "username" : "whatever"
+ }
def __init__(self, **kwargs):
super(PbGradient, self).__init__(**kwargs)
_definitions = {
diff --git a/photoblaster/modules/pblandscape/__init__.py b/photoblaster/modules/pblandscape/__init__.py index fad141e..d002df8 100755 --- a/photoblaster/modules/pblandscape/__init__.py +++ b/photoblaster/modules/pblandscape/__init__.py @@ -5,7 +5,7 @@ import urlparse, re class PbLandscape(Pb): example_params = { - 'imgdata' : open('photoblaster/modules/landscape/_base64img', 'rb').read(), + 'imgdata' : open('photoblaster/modules/pblandscape/_base64img', 'rb').read(), 'texture' : 'http://someurl.biz/someimg.jpg', 'heightmap' : 'http://someurl.biz/someimg.jpg', 'name' : 'donkey' diff --git a/run_module_examples.py b/run_module_examples.py index a6af4b5..838934d 100644 --- a/run_module_examples.py +++ b/run_module_examples.py @@ -3,7 +3,8 @@ from photoblaster.modules import Pb for cls in Pb.__subclasses__(): print cls.__name__ - instance = cls.example_run() - instance.file_s3move() - print instance.file_dict() - instance.db_send(); + if cls.__name__ == "PbGradient": + instance = cls.example_run() + instance.file_s3move() + print instance.file_dict() + instance.db_send(); |
