summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPepper <pepper@scannerjammer.com>2015-11-26 16:26:53 -0500
committerPepper <pepper@scannerjammer.com>2015-11-26 16:26:53 -0500
commit9f6503ebcb20ac2621cd5b0defbb4a20716faf18 (patch)
treee7b1aa36dd8e52ae37964740a7c27e4f30a9beff
parent4bdd7d6891e84289502a8f619e338a3672707ea0 (diff)
rewrote db methods to MVC style
-rw-r--r--controller_stuff29
-rw-r--r--photoblaster/db/__init__.py102
-rw-r--r--photoblaster/db/models/__init__.py54
-rw-r--r--photoblaster/db/models/iasdfus.py9
-rw-r--r--photoblaster/db/models/imcmd.py45
-rw-r--r--photoblaster/db/s3.py36
-rw-r--r--photoblaster/modules/base.py14
-rwxr-xr-xphotoblaster/modules/pbgradient.py35
-rwxr-xr-xphotoblaster/modules/pblandscape/__init__.py2
-rw-r--r--run_module_examples.py9
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();