number poll candidates depending on setting
This commit is contained in:
parent
e2585fb757
commit
b16afaa285
@ -154,7 +154,7 @@ export class ListOfSpeakersComponent extends BaseViewComponent implements OnInit
|
|||||||
private config: ConfigService
|
private config: ConfigService
|
||||||
) {
|
) {
|
||||||
super(title, translate, snackBar);
|
super(title, translate, snackBar);
|
||||||
this.addSpeakerForm = new FormGroup({ user_id: new FormControl([]) });
|
this.addSpeakerForm = new FormGroup({ user_id: new FormControl() });
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -201,6 +201,7 @@ export class ListOfSpeakersComponent extends BaseViewComponent implements OnInit
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
this.subscriptions.push(
|
this.subscriptions.push(
|
||||||
this.config.get('agenda_present_speakers_only').subscribe(() => {
|
this.config.get('agenda_present_speakers_only').subscribe(() => {
|
||||||
this.filterUsers();
|
this.filterUsers();
|
||||||
|
@ -142,7 +142,7 @@
|
|||||||
<os-sorting-list
|
<os-sorting-list
|
||||||
[input]="assignment.assignment_related_users"
|
[input]="assignment.assignment_related_users"
|
||||||
[live]="true"
|
[live]="true"
|
||||||
[count]="true"
|
[count]="assignment.number_poll_candidates"
|
||||||
[enable]="hasPerms('addOthers')"
|
[enable]="hasPerms('addOthers')"
|
||||||
(sortEvent)="onSortingChange($event)"
|
(sortEvent)="onSortingChange($event)"
|
||||||
>
|
>
|
||||||
|
@ -64,7 +64,7 @@ class AgendaAppConfig(AppConfig):
|
|||||||
yield self.get_model("ListOfSpeakers")
|
yield self.get_model("ListOfSpeakers")
|
||||||
|
|
||||||
|
|
||||||
def required_users(element: Dict[str, Any]) -> Set[int]:
|
async def required_users(element: Dict[str, Any]) -> Set[int]:
|
||||||
"""
|
"""
|
||||||
Returns all user ids that are displayed as speaker in the given element.
|
Returns all user ids that are displayed as speaker in the given element.
|
||||||
"""
|
"""
|
||||||
|
@ -72,16 +72,26 @@ class AssignmentsAppConfig(AppConfig):
|
|||||||
yield self.get_model(model_name)
|
yield self.get_model(model_name)
|
||||||
|
|
||||||
|
|
||||||
def required_users(element: Dict[str, Any]) -> Set[int]:
|
async def required_users(element: Dict[str, Any]) -> Set[int]:
|
||||||
"""
|
"""
|
||||||
Returns all user ids that are displayed as candidates (including poll
|
Returns all user ids that are displayed as candidates (including poll
|
||||||
options) in the assignment element.
|
options) in the assignment element.
|
||||||
|
|
||||||
TODO: Adapt this method for new poll structure!!
|
|
||||||
"""
|
"""
|
||||||
|
from openslides.assignments.models import AssignmentPoll, AssignmentOption
|
||||||
|
from openslides.utils.cache import element_cache
|
||||||
|
|
||||||
candidates = set(
|
candidates = set(
|
||||||
related_user["user_id"] for related_user in element["assignment_related_users"]
|
related_user["user_id"] for related_user in element["assignment_related_users"]
|
||||||
)
|
)
|
||||||
for poll in element["polls"]:
|
for poll_id in element["polls_id"]:
|
||||||
candidates.update(option["candidate_id"] for option in poll["options"])
|
poll = await element_cache.get_element_data(
|
||||||
|
AssignmentPoll.get_collection_string(), poll_id
|
||||||
|
)
|
||||||
|
if poll:
|
||||||
|
for option_id in poll["options_id"]:
|
||||||
|
option = await element_cache.get_element_data(
|
||||||
|
AssignmentOption.get_collection_string(), option_id
|
||||||
|
)
|
||||||
|
if option:
|
||||||
|
candidates.add(option["user_id"])
|
||||||
return candidates
|
return candidates
|
||||||
|
@ -86,6 +86,7 @@ class AssignmentManager(BaseManager):
|
|||||||
"lists_of_speakers",
|
"lists_of_speakers",
|
||||||
"tags",
|
"tags",
|
||||||
"attachments",
|
"attachments",
|
||||||
|
"polls",
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ from openslides.poll.serializers import (
|
|||||||
from openslides.utils.rest_api import (
|
from openslides.utils.rest_api import (
|
||||||
BooleanField,
|
BooleanField,
|
||||||
DecimalField,
|
DecimalField,
|
||||||
|
IdPrimaryKeyRelatedField,
|
||||||
IntegerField,
|
IntegerField,
|
||||||
ModelSerializer,
|
ModelSerializer,
|
||||||
ValidationError,
|
ValidationError,
|
||||||
@ -150,6 +151,7 @@ class AssignmentSerializer(ModelSerializer):
|
|||||||
write_only=True, required=False, min_value=1, max_value=3, allow_null=True
|
write_only=True, required=False, min_value=1, max_value=3, allow_null=True
|
||||||
)
|
)
|
||||||
agenda_parent_id = IntegerField(write_only=True, required=False, min_value=1)
|
agenda_parent_id = IntegerField(write_only=True, required=False, min_value=1)
|
||||||
|
polls = IdPrimaryKeyRelatedField(many=True, read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Assignment
|
model = Assignment
|
||||||
@ -169,6 +171,7 @@ class AssignmentSerializer(ModelSerializer):
|
|||||||
"tags",
|
"tags",
|
||||||
"attachments",
|
"attachments",
|
||||||
"number_poll_candidates",
|
"number_poll_candidates",
|
||||||
|
"polls",
|
||||||
)
|
)
|
||||||
validators = (posts_validator,)
|
validators = (posts_validator,)
|
||||||
|
|
||||||
|
@ -107,7 +107,7 @@ class MotionsAppConfig(AppConfig):
|
|||||||
yield self.get_model(model_name)
|
yield self.get_model(model_name)
|
||||||
|
|
||||||
|
|
||||||
def required_users(element: Dict[str, Any]) -> Set[int]:
|
async def required_users(element: Dict[str, Any]) -> Set[int]:
|
||||||
"""
|
"""
|
||||||
Returns all user ids that are displayed as as submitter or supporter in
|
Returns all user ids that are displayed as as submitter or supporter in
|
||||||
any motion if request_user can see motions. This function may return an
|
any motion if request_user can see motions. This function may return an
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
from typing import Any, Callable, Dict, List, Set
|
from typing import Any, Callable, Coroutine, Dict, List, Set
|
||||||
|
|
||||||
from asgiref.sync import async_to_sync
|
from asgiref.sync import async_to_sync
|
||||||
|
|
||||||
@ -59,7 +59,7 @@ class RequiredUsers:
|
|||||||
Helper class to find all users that are required by another element.
|
Helper class to find all users that are required by another element.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
callables: Dict[str, Callable[[Dict[str, Any]], Set[int]]] = {}
|
callables: Dict[str, Callable[[Dict[str, Any]], Coroutine[Any, Any, Set[int]]]] = {}
|
||||||
|
|
||||||
def get_collection_strings(self) -> Set[str]:
|
def get_collection_strings(self) -> Set[str]:
|
||||||
"""
|
"""
|
||||||
@ -68,7 +68,9 @@ class RequiredUsers:
|
|||||||
return set(self.callables.keys())
|
return set(self.callables.keys())
|
||||||
|
|
||||||
def add_collection_string(
|
def add_collection_string(
|
||||||
self, collection_string: str, callable: Callable[[Dict[str, Any]], Set[int]]
|
self,
|
||||||
|
collection_string: str,
|
||||||
|
callable: Callable[[Dict[str, Any]], Coroutine[Any, Any, Set[int]]],
|
||||||
) -> None:
|
) -> None:
|
||||||
"""
|
"""
|
||||||
Add a callable for a collection_string to get the required users of the
|
Add a callable for a collection_string to get the required users of the
|
||||||
@ -94,7 +96,7 @@ class RequiredUsers:
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
for element in collection_data.values():
|
for element in collection_data.values():
|
||||||
user_ids.update(get_user_ids(element))
|
user_ids.update(await get_user_ids(element))
|
||||||
|
|
||||||
return user_ids
|
return user_ids
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@ def test_assignment_db_queries():
|
|||||||
* 1 request to get the list of speakers,
|
* 1 request to get the list of speakers,
|
||||||
* 1 request to get the tags,
|
* 1 request to get the tags,
|
||||||
* 1 request to get the attachments and
|
* 1 request to get the attachments and
|
||||||
|
* 1 Request to get the polls of the assignment
|
||||||
"""
|
"""
|
||||||
for index in range(10):
|
for index in range(10):
|
||||||
assignment = Assignment.objects.create(title=f"assignment{index}", open_posts=1)
|
assignment = Assignment.objects.create(title=f"assignment{index}", open_posts=1)
|
||||||
@ -34,7 +35,7 @@ def test_assignment_db_queries():
|
|||||||
type=AssignmentPoll.TYPE_NAMED,
|
type=AssignmentPoll.TYPE_NAMED,
|
||||||
)
|
)
|
||||||
|
|
||||||
assert count_queries(Assignment.get_elements)() == 6
|
assert count_queries(Assignment.get_elements)() == 7
|
||||||
|
|
||||||
|
|
||||||
class CreateAssignment(TestCase):
|
class CreateAssignment(TestCase):
|
||||||
|
Loading…
Reference in New Issue
Block a user