From 1dbdfea55f488b063454104ae19730b32aa197db Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Dec 15 2015 10:04:04 +0000 Subject: Make the open_tickets, open_tickets_public and open_request properties This avoids using a relationship instead and allows loading just the row count instead of the entire DB records. --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 82030ed..2ac7776 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -85,6 +85,7 @@ def create_session(db_url, debug=False, pool_recycle=3600): engine = sqlalchemy.create_engine( db_url, echo=debug, pool_recycle=pool_recycle) scopedsession = scoped_session(sessionmaker(bind=engine)) + model.BASE.metadata.bind = scopedsession return scopedsession diff --git a/pagure/lib/model.py b/pagure/lib/model.py index aa2d19b..220e4e2 100644 --- a/pagure/lib/model.py +++ b/pagure/lib/model.py @@ -370,6 +370,42 @@ class Project(BASE): ''' Ensures the settings are properly saved. ''' self._settings = json.dumps(settings) + @property + def open_requests(self): + ''' Returns the number of open pull-requests for this project. ''' + return BASE.metadata.bind.query( + PullRequest + ).filter( + self.id == PullRequest.project_id + ).filter( + PullRequest.status == 'Open' + ).count() + + @property + def open_tickets(self): + ''' Returns the number of open tickets for this project. ''' + return BASE.metadata.bind.query( + Issue + ).filter( + self.id == Issue.project_id + ).filter( + Issue.status == 'Open' + ).count() + + @property + def open_tickets_public(self): + ''' Returns the number of open tickets for this project. ''' + return BASE.metadata.bind.query( + Issue + ).filter( + self.id == Issue.project_id + ).filter( + Issue.status == 'Open' + ).filter( + Issue.private == False + ).count() + + def to_json(self, public=False, api=False): ''' Return a representation of the project as JSON. ''' @@ -461,24 +497,6 @@ class Issue(BASE): 'issues', cascade="delete, delete-orphan", single_parent=True) ) - _p = relation( - 'Project', foreign_keys=[project_id], remote_side=[Project.id], - primaryjoin="and_( " - "Project.id==Issue.project_id, " - "Issue.status=='Open')", - backref=backref( - 'open_tickets', cascade="delete, delete-orphan", single_parent=True) - ) - _p2 = relation( - 'Project', foreign_keys=[project_id], remote_side=[Project.id], - primaryjoin="and_( " - "Project.id==Issue.project_id, " - "Issue.status=='Open', " - "Issue.private==False)", - backref=backref( - 'open_tickets_public', cascade="delete, delete-orphan", single_parent=True) - ) - user = relation('User', foreign_keys=[user_id], remote_side=[User.id], backref='issues') assignee = relation('User', foreign_keys=[assignee_id], @@ -816,15 +834,6 @@ class PullRequest(BASE): project_from = relation( 'Project', foreign_keys=[project_id_from], remote_side=[Project.id]) - _p = relation( - 'Project', foreign_keys=[project_id], remote_side=[Project.id], - primaryjoin="and_( " - "Project.id==PullRequest.project_id, " - "PullRequest.status=='Open')", - backref=backref( - 'open_requests', cascade="delete, delete-orphan", single_parent=True) - ) - user = relation('User', foreign_keys=[user_id], remote_side=[User.id], backref='pull_requests') assignee = relation('User', foreign_keys=[assignee_id], diff --git a/pagure/templates/repo_master.html b/pagure/templates/repo_master.html index 465af04..861f9dd 100644 --- a/pagure/templates/repo_master.html +++ b/pagure/templates/repo_master.html @@ -65,7 +65,7 @@
  • Issues ({{ - repo.open_tickets |length if repo_admin else repo.open_tickets_public | length + repo.open_tickets if repo_admin else repo.open_tickets_public }})
  • {% endif %} @@ -74,7 +74,7 @@
  • - Pull-requests ({{repo.open_requests |length }}) + Pull-requests ({{repo.open_requests }})
  • {% endif %}