]> git.ipfire.org Git - people/jschlag/pbs.git/commitdiff
Refactor repositories
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 9 Oct 2017 20:36:35 +0000 (21:36 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 9 Oct 2017 20:36:35 +0000 (21:36 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/builds.py
src/buildservice/repository.py
src/templates/modules/repository-table.html
src/web/handlers_builds.py

index 9ffe64c0e1804f84ca834d6f91ee2cc8382858e7..c5b6cc2ee0c7607895ec86c547138d2d40417bf6 100644 (file)
@@ -1229,13 +1229,11 @@ class Build(base.Object):
                        return False
 
                # If there is no next repository, we cannot move anything.
-               next_repo = self.repo.next()
-
-               if not next_repo:
+               if not self.repo.next:
                        return False
 
                # If the needed amount of score is reached, we can move forward.
-               if self.score >= next_repo.score_needed:
+               if self.score >= self.repo.next.score_needed:
                        return True
 
                # If the repository does not require a minimal time,
index 9e88a1f38ca5c22571c1f6aa3dcbe0d34b75a5fc..dc5b645b920ab34faef393e5a238be77ea6123b2 100644 (file)
@@ -26,6 +26,10 @@ class Repositories(base.Object):
 
                return iter(repositories)
 
+       def create(self, distro, name, description):
+               return self._get_repository("INSERT INTO repositories(distro_id, name, description) \
+                       VALUES(%s, %s, %s) RETURNING *", distro.id, name, description)
+
        def get_by_id(self, repo_id):
                return self._get_repository("SELECT * FROM repositories \
                        WHERE id = %s", repo_id)
@@ -64,71 +68,40 @@ class Repositories(base.Object):
                return entries
 
 
-class Repository(base.Object):
-       def __init__(self, pakfire, id, data=None):
-               base.Object.__init__(self, pakfire)
-               self.id = id
-
-               # Cache.
-               self._data = data
-               self._next = None
-               self._prev = None
-               self._key  = None
-               self._distro = None
+class Repository(base.DataObject):
+       table = "repositories"
 
-       @property
-       def data(self):
-               if self._data is None:
-                       self._data = self.db.get("SELECT * FROM repositories WHERE id = %s", self.id)
+       def __eq__(self, other):
+               if isinstance(other, self.__class__):
+                       return self.id == other.id
 
-               return self._data
+       def __lt__(self, other):
+               if isinstance(other, self.__class__):
+                       return self.parent_id == other.id
 
-       def __cmp__(self, other):
-               if other is None:
-                       return 1
-
-               if self.id == other.id:
-                       return 0
+       def __iter__(self):
+               builds = self.backend.builds._get_builds("SELECT builds.* FROM repositories_builds \
+                       LEFT JOIN builds ON repositories_builds.build_id = builds.id \
+                       WHERE repositories.repo_id = %s", self.id)
 
-               elif self.id == other.parent_id:
-                       return 1
+               return iter(builds)
 
-               elif self.parent_id == other.id:
-                       return -1
+       def __len__(self):
+               res = self.db.get("SELECT COUNT(*) AS len FROM repositories_builds \
+                       WHERE repo_id = %s", self.id)
 
-               return 1
+               return res.len
 
+       @lazy_property
        def next(self):
-               if self._next is None:
-                       repo = self.db.get("SELECT id FROM repositories \
-                               WHERE parent_id = %s LIMIT 1", self.id)
-
-                       if not repo:
-                               return
-
-                       self._next = Repository(self.pakfire, repo.id)
+               return self.backend.repos._get_repository("SELECT * FROM repositories \
+                       WHERE parent_id = %s", self.id)
 
-               return self._next
-
-       def prev(self):
-               if not self.parent_id:
-                       return
-
-               if self._prev is None:
-                       self._prev = Repository(self.pakfire, self.parent_id)
-
-               return self._prev
-
-       @property
+       @lazy_property
        def parent(self):
-               return self.prev()
-
-       @classmethod
-       def create(cls, pakfire, distro, name, description):
-               id = pakfire.db.execute("INSERT INTO repositories(distro_id, name, description)"
-                       " VALUES(%s, %s, %s)", distro.id, name, description)
-
-               return cls(pakfire, id)
+               if self.data.parent_id:
+                       return self.backend.repos._get_repository("SELECT * FROM repositories \
+                               WHERE id = %s", self.data.parent_id)
 
        @lazy_property
        def distro(self):
@@ -219,16 +192,12 @@ class Repository(base.Object):
        def parent_id(self):
                return self.data.parent_id
 
-       @property
+       @lazy_property
        def key(self):
                if not self.data.key_id:
                        return
 
-               if self._key is None:
-                       self._key = self.pakfire.keys.get_by_id(self.data.key_id)
-                       assert self._key
-
-               return self._key
+               return self.pakfire.keys.get_by_id(self.data.key_id)
 
        @property
        def arches(self):
@@ -236,24 +205,12 @@ class Repository(base.Object):
 
        @property
        def mirrored(self):
-               return self.data.mirrored == "Y"
-
-       def get_enabled_for_builds(self):
-               return self.data.enabled_for_builds == "Y"
+               return self.data.mirrored
 
        def set_enabled_for_builds(self, state):
-               if state:
-                       state = "Y"
-               else:
-                       state = "N"
-
-               self.db.execute("UPDATE repositories SET enabled_for_builds = %s WHERE id = %s",
-                       state, self.id)
+               self._set_attribute("enabled_for_builds", state)
 
-               if self._data:
-                       self._data["enabled_for_builds"] = state
-
-       enabled_for_builds = property(get_enabled_for_builds, set_enabled_for_builds)
+       enabled_for_builds = property(lambda s: s.data.enabled_for_builds, set_enabled_for_builds)
 
        @property
        def score_needed(self):
@@ -311,13 +268,6 @@ class Repository(base.Object):
                        self._log_build("moved", build, from_repo=self, to_repo=to_repo,
                                user=user)
 
-       def build_count(self):
-               query = self.db.get("SELECT COUNT(*) AS count FROM repositories_builds \
-                       WHERE repo_id = %s", self.id)
-
-               if query:
-                       return query.count
-
        def get_builds(self, limit=None, offset=None):
                query = "SELECT build_id AS id FROM repositories_builds \
                        WHERE repo_id = %s ORDER BY time_added DESC"
@@ -393,17 +343,6 @@ class Repository(base.Object):
                return ret
 
        def get_obsolete_builds(self):
-               #query = self.db.query("SELECT build_id AS id FROM repositories_builds \
-               #       JOIN builds ON repositories.build_id = builds.id \
-               #       WHERE repositories_builds.repo_id = %s AND builds.state = 'obsolete'",
-               #       self.id)
-               #
-               #ret = []
-               #for row in query:
-               #       b = builds.Build(self.pakfire, row.id)
-               #       ret.append(b)
-               #
-               #return ret
                return self.pakfire.builds.get_obsolete(self)
 
        def needs_update(self):
@@ -438,23 +377,8 @@ class Repository(base.Object):
                return times
 
 
-class RepositoryAux(base.Object):
-       def __init__(self, pakfire, id):
-               base.Object.__init__(self, pakfire)
-
-               self.id = id
-
-               # Cache.
-               self._data = None
-               self._distro = None
-
-       @property
-       def data(self):
-               if self._data is None:
-                       self._data = self.db.get("SELECT * FROM repositories_aux WHERE id = %s", self.id)
-                       assert self._data
-
-               return self._data
+class RepositoryAux(base.DataObject):
+       table = "repositories_aux"
 
        @property
        def name(self):
@@ -474,11 +398,7 @@ class RepositoryAux(base.Object):
 
        @property
        def distro(self):
-               if self._distro is None:
-                       self._distro = self.pakfire.distros.get_by_id(self.data.distro_id)
-                       assert self._distro
-
-               return self._distro
+               return self.pakfire.distros.get_by_id(self.data.distro_id)
 
        def get_conf(self):
                lines = [
index a62d79f29fce66bb3570173545f80def06759afd..70b228ef0855f711dd19b90dfcd49eef36e45177 100644 (file)
@@ -14,7 +14,7 @@
                                        <br />{{ repo.summary or _("N/A") }}
                                </td>
                                <td>
-                                       {{ repo.build_count() }}
+                                       {{ len(repo) }}
                                </td>
                                <td>
                                        {% if repo.enabled_for_builds %}
index b1a4888e4284181f668c3b2cd091f563c19284a6..3db8f96a7f0d7568567a687a80f161c49fc343f5 100644 (file)
@@ -34,7 +34,7 @@ class BuildDetailHandler(BuildBaseHandler):
                log = build.get_log()
 
                if build.repo:
-                       next_repo = build.repo.next()
+                       next_repo = build.repo.next
                else:
                        next_repo = None
 
@@ -239,7 +239,7 @@ class BuildManageHandler(BaseHandler):
 
                # Get the next repo.
                if build.repo:
-                       next_repo = build.repo.next()
+                       next_repo = build.repo.next
                else:
                        next_repo = build.distro.first_repo
 
@@ -272,7 +272,7 @@ class BuildManageHandler(BaseHandler):
                                raise tornado.web.HTTPError(404, "No such repository: %s" % next_repo)
 
                        if not self.current_user.is_admin():
-                               if not distro.repo.next() == next_repo:
+                               if not distro.repo.next == next_repo:
                                        raise tornado.web.HTTPError(403)
 
                        if current_repo: