Skip to content

Commit

Permalink
WIP process tab
Browse files Browse the repository at this point in the history
  • Loading branch information
dpausp committed Jan 12, 2024
1 parent 0e1b653 commit 6ffc6ac
Show file tree
Hide file tree
Showing 24 changed files with 481 additions and 262 deletions.
6 changes: 6 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ trim_trailing_whitespace = true
end_of_line = lf
charset = utf-8

[*.sass]
indent_size = 2

[*.nix]
indent_size = 2

[*.py]
max_line_length = 140

Expand Down
2 changes: 2 additions & 0 deletions src/ekklesia_portal/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ def app_setting_section():
"internal_login_enabled": True,
"languages": ["de", "en"],
"login_visible": False,
"public_submitters": False,
"public_supporters": False,
"report_url": None,
"source_code_url": "https://github.com/edemocracy/ekklesia-portal",
"title": "Ekklesia Portal Dev",
Expand Down
115 changes: 106 additions & 9 deletions src/ekklesia_portal/concepts/proposition/proposition_cells.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from collections import Counter
import urllib.parse
import math
from operator import attrgetter
Expand All @@ -18,7 +19,7 @@
from ekklesia_portal.concepts.proposition.proposition_permissions import SubmitDraftPermission
from ekklesia_portal.datamodel import Department, Document, Proposition, PropositionNote, PropositionType, Tag, VotingPhase, SecretVoter
from ekklesia_portal.helper.url_shortener import make_tiny
from ekklesia_portal.enums import ArgumentType, OpenSlidesVotingResult, PropositionStatus, SecretVoterStatus
from ekklesia_portal.enums import ArgumentType, OpenSlidesVotingResult, PropositionStatus, SecretVoterStatus, SupporterStatus
from ekklesia_portal.lib.url import url_change_query
from ekklesia_portal.permission import CreatePermission, EditPermission, SupportPermission

Expand Down Expand Up @@ -162,6 +163,9 @@ def share_twitter_url(self):
twitter_url = 'https://twitter.com/intent/tweet?' + twitter_url
return twitter_url

def amendment_count(self):
return len(self._model.derivations)

def ballot_url(self):
return self.link(self._model.ballot)

Expand All @@ -175,6 +179,9 @@ def ballot_title(self):
def discussion_url(self):
return self.link(self._model) + "#bottom"

def process_url(self):
return self.link(self._model, 'process') + "#bottom"

def propositions_badge_url(self, department_name, subject_area_name=None, tag_name=None):
params = {"department": department_name}

Expand Down Expand Up @@ -205,7 +212,10 @@ def discussion_link_class(self):
return 'active' if self.options.get('active_tab') == 'discussion' else ''

def associated_link_class(self):
return 'active' if self.options.get('active_tab') == 'associated' else ''
return "active" if self.options.get("active_tab") == "associated" else ""

def process_link_class(self):
return 'active' if self.options.get('active_tab') == 'process' else ''

def new_amendment_url(self):
return self.link(self._model, '+new_amendment')
Expand All @@ -229,6 +239,18 @@ def missing_submitters_count(self):
def supporter_count(self):
return self._model.active_supporter_count

def supporter_group_count(self):
return len(self._supporters_and_groups[1])

def support_still_required(self):
return self._model.status in (PropositionStatus.SUBMITTED)

def support_still_possible(self):
return self._model.status in (
PropositionStatus.QUALIFIED,
PropositionStatus.VOTING,
)

def become_submitter_action(self):
return self.link(self._model, 'become_submitter')

Expand Down Expand Up @@ -259,14 +281,32 @@ def ready_to_submit(self):
return self._model.ready_to_submit

def show_support(self):
return self._model.status in (PropositionStatus.SUBMITTED, PropositionStatus.QUALIFIED)
return True

if self.current_user is None:
return False

if self._model.status not in (
PropositionStatus.SUBMITTED,
PropositionStatus.QUALIFIED,
):
return False

if self._request.identity.has_global_admin_permissions:
return True

return self._request.permitted_for_current_user(self._model, SupportPermission)

def can_support(self):
return self.show_support and self._request.permitted_for_current_user(self._model, SupportPermission)
return self.show_support

def supporter_quorum_percent(self):
if self._model.qualification_quorum > 0:
return self._model.active_supporter_count / self._model.qualification_quorum * 100
return (
self._model.active_supporter_count
/ self._model.qualification_quorum
* 100
)

def show_secret_voting(self):
return self._model.status in (
Expand Down Expand Up @@ -307,10 +347,13 @@ def show_create_counter_proposition(self):
PropositionStatus.SCHEDULED
) and self._request.permitted_for_current_user(Propositions(), CreatePermission) and self._model.modifies is None

def show_submitter_names(self):
def show_submitters(self):
if self.current_user is None:
return False

if self._s.app.public_submitters:
return True

if self._model.ballot.area.department in self.current_user.managed_departments:
return True

Expand All @@ -325,6 +368,26 @@ def show_submitter_names(self):

return False

def show_supporters(self):
if self.current_user is None:
return False

if self._model.status not in (
PropositionStatus.SUBMITTED,
PropositionStatus.QUALIFIED,
PropositionStatus.VOTING,
):
return False

if self._s.app.public_supporters:
return True

if self._model.ballot.area.department in self.current_user.managed_departments:
return True

if self._request.identity.has_global_admin_permissions:
return True

def valid_submitter_invitation_key(self):
key = self._request.GET.get("submitter_invitation_key")
if key is None:
Expand Down Expand Up @@ -374,10 +437,44 @@ def note_url(self):
)

def become_submitter_url(self):
return self.self_link + f"?submitter_invitation_key={self._model.submitter_invitation_key}"
return (
self.self_link
+ f"?submitter_invitation_key={self._model.submitter_invitation_key}"
)

def submitters(self):
submitters = []

for pm in self._model.propositions_member:
if pm.submitter:
user = pm.member
group_names = ", ".join(g.name for g in user.groups)
submitters.append(f"{user.name} ({group_names})")

return submitters

@cached_property
def _supporters_and_groups(self):
supporters = []
group_counter = Counter()

for pm in self._model.propositions_member:
if pm.status == SupporterStatus.ACTIVE:
user = pm.member
group_names = [g.name for g in user.groups]
group_str = ", ".join(group_names)
supporters.append(f"{user.name} ({group_str})")
group_counter.update(group_names)

groups = [f"{name} ({count})" for name, count in group_counter.items()]

return (supporters, groups)

def supporters(self):
return self._supporters_and_groups[0]

def submitter_names(self):
return [pm.member.name for pm in self._model.propositions_member if pm.submitter]
def supporter_groups(self):
return self._supporters_and_groups[1]

def show_full_history(self):
return self.options.get('show_details')
Expand Down
11 changes: 11 additions & 0 deletions src/ekklesia_portal/concepts/proposition/proposition_views.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import secrets
import time
from datetime import datetime

import base32_crockford
Expand Down Expand Up @@ -120,12 +121,22 @@ def __init__(self, proposition_id=LID()):
@App.html(model=Proposition, permission=ViewPermission)
def show(self, request):
cell = PropositionCell(self, request, show_tabs=True, show_details=True, show_actions=True, active_tab='discussion')
if request.htmx:
time.sleep(1)
return cell.show()


@App.html(model=Proposition, name='associated', permission=ViewPermission)
def associated(self, request):
cell = PropositionCell(self, request, show_tabs=True, show_details=True, show_actions=True, active_tab='associated')
if request.htmx:
time.sleep(3)
return cell.show()


@App.html(model=Proposition, name='process', permission=ViewPermission)
def process(self, request):
cell = PropositionCell(self, request, show_tabs=True, show_details=True, show_actions=True, active_tab='process')
return cell.show()


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,3 @@
else
p
a(href=login_url)= _('notice_login')

if show_submitter_names and submitter_names
p= _('current_submitters')
ul
for name in submitter_names
li= name
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,3 @@
h2= _('title_qualified_proposition')

p= _('info_qualified_proposition')

if show_submitter_names and submitter_names
p= _('submitters')
ul
for name in submitter_names
li= name
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,3 @@
h2= _('title_scheduled_proposition')

p= _('info_scheduled_proposition', ballot=ballot_title, voting_phase=voting_phase.title)

if show_submitter_names and submitter_names
p= _('submitters')
ul
for name in submitter_names
li= name
Original file line number Diff line number Diff line change
@@ -1,23 +1,21 @@
#detail_top(hx-swap-oob="true")
h2= _('title_submitted_proposition')

p= _('info_submitted_proposition')
p
= _('info_submitted_proposition')
| 
a(href=link(_model, "process")) More info...

if current_user_is_submitter
p= _('current_user_is_submitter')
p
= _('current_user_is_submitter')

if current_user_is_supporter
p= _('current_user_is_submitter_and_supporter')
if current_user_is_supporter
= " " + _('current_user_is_submitter_and_supporter')

elif current_user_is_supporter
p= _('current_user_is_supporter_not_submitter')

elif can_support
p= _('current_user_can_support')

if show_submitter_names and submitter_names
p= _('submitters')
ul
for name in submitter_names
li= name

Original file line number Diff line number Diff line change
@@ -1,27 +1,17 @@
#secret_voting(hx-swap-oob="true")
.col-sm-6
form.secret_voting_form(action=secret_voting_url
method="POST"
hx-post=secret_voting_url)
span#secret_voting(hx-swap-oob="true")
form.secret_voting_form(action=secret_voting_url
method="POST"
hx-post=secret_voting_url)

if secret_voting_requested
input(type="hidden", name="secret_voting", value="retract")
button.btn.btn-secondary.btn-sm(type="submit")
= _('button_retract_secret_voting')
else
input(type="hidden", name="secret_voting", value="request")
button.btn.btn-secondary.btn-sm(type="submit")
i.far.fa-eye-slash  
= _('button_request_secret_voting')

.col-sm-6
.progress(title=(_('abbr_secret_voters_count') + " / " + _('abbr_secret_voting_quorum')))
.progress-bar(role="progressbar"
style="width: {{ secret_voters_count/secret_voting_quorum * 100 }}%"
aria-valuenow=secret_voters_count
aria-valuemin="0"
aria-valuemax=secret_voting_quorum)
| {{ secret_voters_count }} / {{ secret_voting_quorum }}
if secret_voting_requested
input(type="hidden", name="secret_voting", value="retract")
button.btn.btn-secondary.btn-sm(type="submit")
= _('button_retract_secret_voting')
else
input(type="hidden", name="secret_voting", value="request")
button.btn.btn-secondary.btn-sm(type="submit")
i.far.fa-eye-slash  
= _('button_request_secret_voting')


//- vim: set filetype=jade sw=2 ts=2 sts=2 expandtab:
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

.proposition_small_footer
.row
.col-sm-5.points
.col-sm-5.supporter_count
i.far.fa-thumbs-up  
strong.proposition_info_number(id="proposition_score_{{ id }}")= supporter_count
|  
Expand Down
Loading

0 comments on commit 6ffc6ac

Please sign in to comment.