return set([row.bug_id for row in rows])
- async def add_bug(self, bug_id, user=None):
- await self.db.execute("""
- INSERT INTO
- build_bugs
- (
- build_id,
- bug_id,
- added_by
- )
- VALUES
- (
- %s, %s, %s
+ async def _find_bug(self, bug_id):
+ """
+ Fetches a specific bug
+ """
+ stmt = (
+ sqlalchemy
+ .select(
+ BuildBug,
)
- ON CONFLICT
- (
- build_id,
- bug_id
+ .where(
+ BuildBug.build == self,
+ BuildBug.bug_id == bug_id,
+ BuildBug.removed_at == None,
)
- WHERE
- removed_at IS NULL
- DO NOTHING
- """, self.id, bug_id, user,
)
- # Add to cache
- self.bug_ids.add(bug_id)
+ return await self.db.fetch_one(stmt)
- async def remove_bug(self, bug_id, user):
- await self.db.execute("""
- UPDATE
- build_bugs
- SET
- removed_at = CURRENT_TIMESTAMP,
- removed_by = %s
- WHERE
- build_id = %s
- AND
- bug_id = %s
- """, self.id, bug_id,
+ async def add_bug(self, bug_id, added_by=None):
+ """
+ Adds a new bug to this build
+ """
+ bug = await self.db.insert(
+ BuildBug,
+ build = self,
+ bug_id = bug_id,
+ added_by = added_by,
)
- # Remove from cache
- try:
- self.bug_ids.remove(bug_id)
- except KeyError:
- pass
+ # Log action
+ log.info("Added %s to %s" % (bug, self))
+
+ return bug
+
+ async def remove_bug(self, bug_id, removed_by=None):
+ """
+ Removes a bug from this build
+ """
+ bug = await self._find_bug(bug_id)
+
+ # Nothing to do if we couldn't find the bug
+ if not bug:
+ return
+
+ # Remove it
+ bug.remove(removed_by=removed_by)
+
+ # Log action
+ log.info("Removed %s from %s" % (bug, self))
+
+ return bug
async def get_bugs(self):
"""
self.failed = True
-class BuildBug(database.Base, database.BackendMixin):
+class BuildBug(database.Base):
__tablename__ = "build_bugs"
+ def __str__(self):
+ return "#%s" % self.bug_id
+
# ID
id = Column(Integer, primary_key=True)
"User", foreign_keys=[removed_by_id], lazy="joined",
)
+ # Remove!
+
+ def remove(self, removed_by=None):
+ """
+ Remove the bug from this build
+ """
+ self.removed_at = sqlalchemy.func.current_timestamp()
+
+ # Optionally store the user
+ if removed_by:
+ self.removed_by = removed_by
+
class BuildComment(database.Base, database.BackendMixin, database.SoftDeleteMixin):
__tablename__ = "build_comments"