# -*- coding: utf-8 -*- """ grumpy.models ~~~~~~~~~~~~~ This module contains the models and low-level database glue for the application. :copyright: (c) by 2010 Priit Laes. :license: BSD, see LICENSE for details. """ from datetime import datetime from sqlalchemy import Column, DateTime, ForeignKey, Integer, String, Table from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() # Association tables package_developers = Table('package_developers', Base.metadata, Column('package_id', Integer, ForeignKey('packages.id')), Column('developer_id', Integer, ForeignKey('developers.id')) ) package_herds = Table('package_herds', Base.metadata, Column('package_id', Integer, ForeignKey('packages.id')), Column('herd_id', Integer, ForeignKey('herds.id')) ) class Category(Base): """Represents portage categories""" __tablename__ = 'categories' id = Column('id', Integer, primary_key=True) cat = Column('category', String, nullable=False, unique=True) def __init__(self, cat): self.cat = cat def __repr__(self): return '<%s> "%s"' % (self.__class__.__name__, self.cat) class Developer(Base): """Represents developers in the system""" __tablename__ = 'developers' id = Column('id', Integer, primary_key=True) email = Column('email', String, nullable=False, unique=True) def __init__(self, email): self.email = email class Ebuild(Base): """Represents single ebuilds (cpv) in the system""" __tablename__ = 'ebuilds' id = Column('id', Integer, primary_key=True) cpv = Column('cpv', String, nullable=False, unique=True) eapi = Column('eapi', Integer, nullable=False) # Regular USE flags iuse = Column('iuse', String) # Forced USE flags (+use) fiuse = Column('fiuse', String) keywords = Column('keywords', String) slot = Column('slot', String) version = Column('version', String, nullable=False) _package = Column('package_id', Integer, ForeignKey('packages.id')) # TODO: depend, rdepend, licenses # TODO: extra info? package = relationship("Package") def __init__(self, package, version, eapi, slot, keywords, \ iuse, fiuse): self.package = package self.version = version self.cpv = "%s/%s-%s" % (package.pkg, package.cat, self.version) self.eapi = eapi self.slot = slot self.iuse = ','.join(iuse) self.fiuse = ','.join(fiuse) self.keywords = ','.join(keywords) def __repr__(self): return '<%s> - %s' % (self.__class__.__name__, self.cpv) class Herd(Base): """Represents herds in the system""" __tablename__ = 'herds' id = Column('id', Integer, primary_key=True) name = Column('name', String, nullable=False, unique=True) # TODO: Do we really need to store other information about herds here? def __init__(self, name): self.name = name class Package(Base): """Represents packages in the system""" __tablename__ = 'packages' id = Column('id', Integer, primary_key=True) cat = Column('cat', String, nullable=False) pkg = Column('pkg', String, nullable=False) cp = Column('cp', String, nullable=False, unique=True) desc = Column('desc', String) ldesc = Column('ldesc', String) homepage = Column('homepage', String) mtime = Column('mtime', DateTime) ebuilds = relationship(Ebuild, backref='ebuilds', \ cascade='all, delete-orphan') devs = relationship(Developer, secondary=package_developers, \ backref='packages') herds = relationship(Herd, secondary=package_herds, backref='packages') def __init__(self, cat, pkg, desc, ldesc, homepage, mtime): self.cat = cat self.pkg = pkg self.cp = "%s/%s" % (pkg, cat) self.desc = desc self.ldesc = ldesc self.homepage = homepage self.mtime = datetime.fromtimestamp(mtime) self.devs = [] self.herds = [] self.ebuilds = [] def __repr__(self): return '<%s> - %s' % (self.__class__.__name__, self.cp)