Skip to content

Commit

Permalink
Extract methods to a separate module
Browse files Browse the repository at this point in the history
  • Loading branch information
mic4ael committed Dec 11, 2017
1 parent cf8fd4b commit 47de067
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 50 deletions.
2 changes: 1 addition & 1 deletion indico/core/db/sqlalchemy/review_questions.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,9 +141,9 @@ def get_review_rating(self, review, allow_create=False):
def title(self):
return self.text

# Required by BaseField for creating an instance of WTForms field
@property
def description(self):
"""Required by BaseField while creating an instance of WTForms field"""
return None

@hybrid_property
Expand Down
41 changes: 14 additions & 27 deletions indico/modules/events/abstracts/controllers/management.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

from __future__ import unicode_literals

from operator import attrgetter, itemgetter
from operator import itemgetter

from flask import flash, redirect, request, session
from werkzeug.exceptions import NotFound
Expand All @@ -33,6 +33,8 @@
from indico.modules.events.abstracts.settings import abstracts_reviewing_settings, abstracts_settings
from indico.modules.events.abstracts.util import get_roles_for_event
from indico.modules.events.abstracts.views import WPManageAbstracts
from indico.modules.events.operations import (create_reviewing_question, delete_reviewing_question,
sort_reviewing_questions, update_reviewing_question)
from indico.modules.events.reviewing_questions_fields import get_reviewing_field_types
from indico.modules.events.util import update_object_principals
from indico.util.i18n import _
Expand Down Expand Up @@ -180,32 +182,13 @@ def _process_args(self):
def _process(self):
form = self.field_cls.create_config_form()
if form.validate_on_submit():
new_question = AbstractReviewQuestion()
new_question.no_score = True if self.field_cls.name != 'rating' else form.no_score
field = self.field_cls(new_question)
field.update_object(form.data)
form.populate_obj(new_question)
new_question = create_reviewing_question(self.event, AbstractReviewQuestion, self.field_cls, form)
self.event.abstract_review_questions.append(new_question)
logger.info("New abstract reviewing question %s has been created by %s", new_question, session.user)
logger.info("Abstract reviewing question %r created by %r", new_question, session.user)
return jsonify_data(flash=False)
return jsonify_form(form, fields=getattr(form, '_order', None))


class RHSortReviewingQuestions(RHManageAbstractsBase):
def _process(self):
questions_by_id = {q.id: q for q in self.event.abstract_review_questions}
question_ids = map(int, request.form.getlist('field_ids'))

for index, question_id in enumerate(question_ids, 0):
questions_by_id[question_id].position = index
del questions_by_id[question_id]
for index, field in enumerate(sorted(questions_by_id.values(), key=attrgetter('position')), len(question_ids)):
field.position = index

logger.info("Abstract reviewing questions of %s have been reordered by %s", self.event, session.user)
return jsonify_data(flash=False)


class RHReviewingQuestionBase(RHManageAbstractsBase):
locator_args = {
lambda self: self.question
Expand All @@ -221,15 +204,19 @@ def _process(self):
defaults = FormDefaults(obj=self.question, **self.question.field_data)
form = self.question.field.create_config_form(obj=defaults)
if form.validate_on_submit():
self.question.field.update_object(form.data)
form.populate_obj(self.question)
logger.info("Abstract reviewing question %s has been updated by %s", self.question, session.user)
update_reviewing_question(self.question, form)
return jsonify_data(flash=False)
return jsonify_form(form, fields=getattr(form, '_order', None))


class RHDeleteAbstractReviewingQuestion(RHReviewingQuestionBase):
def _process(self):
self.question.is_deleted = True
logger.info("Abstract reviewing question %s has been deleted by %s", self.question, session.user)
delete_reviewing_question(self.question)
return jsonify_data(flash=False)


class RHSortReviewingQuestions(RHManageAbstractsBase):
def _process(self):
question_ids = map(int, request.form.getlist('field_ids'))
sort_reviewing_questions(self.event.abstract_review_questions, question_ids)
return jsonify_data(flash=False)
40 changes: 40 additions & 0 deletions indico/modules/events/operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

from __future__ import unicode_literals

from operator import attrgetter

from flask import session

from indico.core import signals
Expand Down Expand Up @@ -278,3 +280,41 @@ def unlock_event(event):
db.session.flush()
logger.info('Event %r unlocked by %r', event, session.user)
event.log(EventLogRealm.event, EventLogKind.change, 'Event', 'Event unlocked', session.user)


def create_reviewing_question(event, question_model, wtf_field_cls, form, data=None):
new_question = question_model()
new_question.no_score = True
if 'no_score' in form.data:
new_question.no_score = form.data['no_score']

field = wtf_field_cls(new_question)
field.update_object(form.data)
form.populate_obj(new_question)
if data is not None:
new_question.populate_from_dict(data)
return new_question


def update_reviewing_question(question, form):
question.field.update_object(form.data)
form.populate_obj(question)
db.session.flush()
logger.info("Reviewing question %r updated by %r", question, session.user)


def delete_reviewing_question(question):
question.is_deleted = True
db.session.flush()
logger.info("Reviewing question %r deleted by %r", question, session.user)


def sort_reviewing_questions(questions, new_positions):
questions_by_id = {q.id: q for q in questions}
for index, new_position in enumerate(new_positions, 0):
questions_by_id[new_position].position = index
del questions_by_id[new_position]
for index, field in enumerate(sorted(questions_by_id.values(), key=attrgetter('position')), len(new_positions)):
field.position = index
db.session.flush()
logger.info("Reviewing questions of %r reordered by %r", questions[0].event, session.user)
31 changes: 9 additions & 22 deletions indico/modules/events/papers/controllers/management.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@

from __future__ import unicode_literals

from operator import attrgetter

from flask import flash, render_template, request, session
from werkzeug.exceptions import NotFound

from indico.modules.events.operations import (create_reviewing_question, delete_reviewing_question,
sort_reviewing_questions, update_reviewing_question)
from indico.modules.events.papers import logger
from indico.modules.events.papers.controllers.base import RHManagePapersBase
from indico.modules.events.papers.forms import (DeadlineForm, PaperReviewingSettingsForm, PapersScheduleForm,
Expand Down Expand Up @@ -253,13 +253,10 @@ def _process_args(self):
def _process(self):
form = self.field_cls.create_config_form()
if form.validate_on_submit():
new_question = PaperReviewQuestion()
new_question.type = PaperReviewType.get(self.review_type)
field = self.field_cls(new_question)
field.update_object(form.data)
form.populate_obj(new_question)
new_question = create_reviewing_question(self.event, PaperReviewQuestion, self.field_cls, form,
{'type': PaperReviewType[self.review_type]})
self.event.paper_review_questions.append(new_question)
logger.info("Paper reviewing question %s has been created by %s", new_question, session.user)
logger.info("Reviewing question %r created by %r", new_question, session.user)
return jsonify_data(flash=False)
return jsonify_form(form, fields=getattr(form, '_order', None))

Expand All @@ -277,34 +274,24 @@ def _process(self):
defaults = FormDefaults(obj=self.question, **self.question.field_data)
form = self.question.field.create_config_form(obj=defaults)
if form.validate_on_submit():
self.question.field.update_object(form.data)
form.populate_obj(self.question)
logger.info("Paper reviewing question %s has been updated by %s", self.question, session.user)
update_reviewing_question(self.question, form)
return jsonify_data(flash=False)
return jsonify_form(form, fields=getattr(form, '_order', None))


class RHDeleteReviewingQuestion(RHManageQuestionBase):
def _process(self):
self.question.is_deleted = True
logger.info("Paper reviewing question %s has been deleted by %s", self.question, session.user)
delete_reviewing_question(self.question)
return jsonify_data(flash=False)


class RHSortReviewingQuestions(RHReviewingQuestionsActionsBase):
def _process(self):
question_ids = map(int, request.form.getlist('field_ids'))
if self.review_type == 'layout':
questions = self.event.cfp.layout_review_questions
else:
questions = self.event.cfp.content_review_questions

questions_by_id = {q.id: q for q in questions}
question_ids = map(int, request.form.getlist('field_ids'))
for index, question_id in enumerate(question_ids, 0):
questions_by_id[question_id].position = index
del questions_by_id[question_id]
for index, field in enumerate(sorted(questions_by_id.values(), key=attrgetter('position')), len(question_ids)):
field.position = index

logger.info("Paper reviewing questions of %s have been reordered by %s", self.event, session.user)
sort_reviewing_questions(questions, question_ids)
return jsonify_data(flash=False)

0 comments on commit 47de067

Please sign in to comment.