From 88af00921a3813b132c590925cc01386d8c1cd77 Mon Sep 17 00:00:00 2001 From: apoorvad Date: Tue, 17 Nov 2015 18:15:10 -0800 Subject: [PATCH] Consolidating database calls in db.py Change-Id: Ic50c3a91aab815056eab9d7c36a7748cacdf6e53 --- .gitignore | 1 + ciwatch/api.py | 32 +++++--------------------------- ciwatch/db.py | 47 +++++++++++++++++++++++++++++++++++++++++++++-- ciwatch/events.py | 24 +++--------------------- ciwatch/views.py | 3 +-- 5 files changed, 55 insertions(+), 52 deletions(-) diff --git a/.gitignore b/.gitignore index e625780..2073d5c 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,4 @@ ChangeLog *~ .*.swp .*sw? +.idea/ diff --git a/ciwatch/api.py b/ciwatch/api.py index c11785f..ff54bea 100644 --- a/ciwatch/api.py +++ b/ciwatch/api.py @@ -17,14 +17,8 @@ from datetime import datetime from datetime import timedelta from flask import request -from sqlalchemy import and_ -from sqlalchemy import desc from ciwatch import db -from ciwatch.models import CiServer -from ciwatch.models import PatchSet -from ciwatch.models import Project - TIME_OPTIONS = OrderedDict([ # Map time options to hours ("24 hours", 24), @@ -48,34 +42,18 @@ def _get_ci_info_for_patch_sets(ci, patch_sets): return ci_info -def get_projects(): - return db.Session().query(Project).order_by(Project.name).all() - - -def get_ci_servers(): - return db.Session().query(CiServer).order_by( - desc(CiServer.trusted), CiServer.name).all() - - -def get_patch_sets(project, since): - return db.Session().query(PatchSet).filter( - and_(PatchSet.project == project, PatchSet.created >= since) - ).order_by(PatchSet.created.desc()).all() - - def get_time_options(): return TIME_OPTIONS.keys() def get_context(): - project = request.args.get('project', DEFAULT_PROJECT) + project_name = request.args.get('project', DEFAULT_PROJECT) time = request.args.get('time', DEFAULT_TIME_OPTION) since = datetime.now() - timedelta(hours=TIME_OPTIONS[time]) - project = db.Session().query(Project).filter( - Project.name == project).one() - patch_sets = get_patch_sets(project=project, since=since) + project = db.get_project(project_name) + patch_sets = db.get_patch_sets(project=project_name, since=since) results = OrderedDict() - for ci in get_ci_servers(): + for ci in db.get_ci_servers(): ci_info = _get_ci_info_for_patch_sets(ci, patch_sets) if any(result for result in ci_info["results"]): results[ci.ci_owner] = results.get(ci.ci_owner, []) @@ -86,5 +64,5 @@ def get_context(): "time_option": time, "patch_sets": patch_sets, "project": project, - "projects": get_projects(), + "projects": db.get_projects(), "user_results": results} diff --git a/ciwatch/db.py b/ciwatch/db.py index 05b4f62..40de491 100644 --- a/ciwatch/db.py +++ b/ciwatch/db.py @@ -12,10 +12,13 @@ # License for the specific language governing permissions and limitations # under the License. +from sqlalchemy import and_ from sqlalchemy import create_engine +from sqlalchemy import desc from sqlalchemy.orm import scoped_session from sqlalchemy.orm import sessionmaker + from ciwatch.config import Config from ciwatch import models @@ -35,7 +38,7 @@ def create_projects(): Session().commit() -def update_or_create_comment(commit_=True, **kwargs): +def update_or_create_comment(commit_= True, **kwargs): session = Session() comment = session.query(models.Comment).filter_by( ci_server_id=kwargs['ci_server_id'], @@ -49,7 +52,7 @@ def update_or_create_comment(commit_=True, **kwargs): session.commit() -def get_or_create(model, commit_=True, **kwargs): +def get_or_create(model, commit_= True, **kwargs): session = Session() result = session.query(model).filter_by(**kwargs).first() if not result: @@ -58,3 +61,43 @@ def get_or_create(model, commit_=True, **kwargs): if commit_: session.commit() return result + + +def get_projects(): + return Session().query(models.Project).order_by(models.Project.name).all() + + +def get_ci_servers(): + return Session().query(models.CiServer).order_by( + desc(models.CiServer.trusted), models.CiServer.name).all() + + +def get_patch_sets(project_name, since): + return Session().query(models.PatchSet).filter( + and_(models.PatchSet.project == project_name, + models.PatchSet.created >= since) + ).order_by(models.PatchSet.created.desc()).all() + + +def get_project(project_name): + return Session().query(models.Project).filter( + models.Project.name == project_name).one() + + +def create_event_to_db(event, trusted, patch_set, commit_): + owner_name = event["author"]["name"] + owner = get_or_create(models.CiOwner, name=owner_name) + for ci, data in event['ci-status'].iteritems(): + ci_server = get_or_create(models.CiServer, + commit_=False, + name=ci, + trusted=trusted, + ci_owner_id=owner.id) + update_or_create_comment(commit_=False, + result=data["result"], + log_url=data["log_url"], + ci_server_id=ci_server.id, + patch_set_id=patch_set.id) + if commit_: + Session().commit() + \ No newline at end of file diff --git a/ciwatch/events.py b/ciwatch/events.py index a748cd1..22dafea 100644 --- a/ciwatch/events.py +++ b/ciwatch/events.py @@ -121,10 +121,8 @@ def parse_json_event(event, projects): def add_event_to_db(event, commit_=True): - session = db.Session() - project = session.query(models.Project).filter( - models.Project.name == _process_project_name( - event["change"]["project"])).one() + project = db.get_project(_process_project_name( + event["change"]["project"])) patch_set = db.get_or_create( models.PatchSet, commit_=False, @@ -133,9 +131,6 @@ def add_event_to_db(event, commit_=True): commit_message=event['change']['commitMessage'], created=datetime.fromtimestamp( int(event['patchSet']['createdOn']))) - - owner_name = event["author"]["name"] - owner = db.get_or_create(models.CiOwner, name=owner_name) trusted = (event["author"]["username"] == "jenkins") if trusted and "approvals" in event: @@ -143,20 +138,7 @@ def add_event_to_db(event, commit_=True): patch_set.verified = True elif event["approvals"][0]["value"] in ("-1", "-2"): patch_set.verified = False - - for ci, data in event['ci-status'].iteritems(): - ci_server = db.get_or_create(models.CiServer, - commit_=False, - name=ci, - trusted=trusted, - ci_owner_id=owner.id) - db.update_or_create_comment(commit_=False, - result=data["result"], - log_url=data["log_url"], - ci_server_id=ci_server.id, - patch_set_id=patch_set.id) - if commit_: - session.commit() + db.create_event_to_db(event, trusted, patch_set, commit_) def main(): diff --git a/ciwatch/views.py b/ciwatch/views.py index f4f5a63..5ae151d 100644 --- a/ciwatch/views.py +++ b/ciwatch/views.py @@ -17,7 +17,6 @@ from sqlalchemy.orm.exc import NoResultFound from werkzeug.exceptions import abort from ciwatch.api import get_context -from ciwatch.api import get_projects from ciwatch.cache import cached from ciwatch import db from ciwatch.server import app @@ -29,7 +28,7 @@ from ciwatch.server import app def home(): try: return render_template( - 'index.html.jinja', projects=get_projects()) + 'index.html.jinja', projects=db.get_projects()) finally: db.Session.remove()