#-*- coding: utf-8 -*-
"""
(c) 2014 - Copyright Red Hat Inc
Authors:
Pierre-Yves Chibon <pingou@pingoured.fr>
"""
import os
import sqlalchemy
from datetime import timedelta
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm.exc import NoResultFound
from sqlalchemy.exc import SQLAlchemyError
import pygit2
import progit.exceptions
from progit import model
def create_session(db_url, debug=False, pool_recycle=3600):
""" Create the Session object to use to query the database.
:arg db_url: URL used to connect to the database. The URL contains
information with regards to the database engine, the host to connect
to, the user and password and the database name.
ie: <engine>://<user>:<password>@<host>/<dbname>
:kwarg debug: a boolean specifying wether we should have the verbose
output of sqlalchemy or not.
:return a Session that can be used to query the database.
"""
engine = sqlalchemy.create_engine(
db_url, echo=debug, pool_recycle=pool_recycle)
scopedsession = scoped_session(sessionmaker(bind=engine))
return scopedsession
def get_user_project(session, username):
''' Retrieve the list of projects managed by a user.
'''
query = session.query(
model.Project
).filter(
model.Project.user == username
)
return query.all()
def new_project(session, user, name, folder,
description=None, parent_id=None):
''' Create a new project based on the information provided.
'''
gitrepo = os.path.join(folder, '%s.git' % name)
if os.path.exists(gitrepo):
raise progit.exceptions.RepoExistsException(
'The project "%s" already exists' % name
)
project = model.Project(
name=name,
description=description,
user=user,
parent_id=parent_id
)
session.add(project)
# Make sure we won't have SQLAlchemy error before we create the repo
session.flush()
pygit2.init_repository(gitrepo, bare=True)
return 'Project "%s" created' % name
def list_projects(session, start=None, limit=None):
"""List existing projects"""
projects = session.query(model.Project)
if start is not None:
projects = projects.offset(start)
if limit is not None:
projects = projects.limit(limit)
return projects.all()
def count_projects(session):
"""Count the number of projects in the database"""
return session.query(model.Project).count()
def get_project(session, name):
"""Get a project from the database"""
return session.query(model.Project).filter_by(name=name).first()