| |
@@ -1,9 +1,12 @@
|
| |
import flask
|
| |
from . import user_ns
|
| |
+ from coprs import app, db, models, helpers
|
| |
+ from coprs.forms import PinnedCoprsForm
|
| |
from coprs.views.misc import login_required
|
| |
from coprs.logic.users_logic import UsersLogic, UserDataDumper
|
| |
from coprs.logic.builds_logic import BuildsLogic
|
| |
from coprs.logic.complex_logic import ComplexLogic
|
| |
+ from coprs.logic.coprs_logic import CoprsLogic, PinnedCoprsLogic
|
| |
|
| |
|
| |
def render_user_info(user):
|
| |
@@ -37,3 +40,60 @@
|
| |
UsersLogic.delete_user_data(flask.g.user.username)
|
| |
flask.flash("Your data were successfully deleted.")
|
| |
return render_user_info(flask.g.user)
|
| |
+
|
| |
+
|
| |
+ @user_ns.route("/customize-pinned/")
|
| |
+ @user_ns.route("/customize-pinned/<group_name>")
|
| |
+ @login_required
|
| |
+ def pinned_projects(group_name=None):
|
| |
+ owner = flask.g.user if not group_name else ComplexLogic.get_group_by_name_safe(group_name)
|
| |
+ return render_pinned_projects(owner)
|
| |
+
|
| |
+
|
| |
+ def render_pinned_projects(owner, form=None):
|
| |
+ pinned = [pin.copr for pin in PinnedCoprsLogic.get_by_owner(owner)]
|
| |
+ if isinstance(owner, models.Group):
|
| |
+ UsersLogic.raise_if_not_in_group(flask.g.user, owner)
|
| |
+ coprs = CoprsLogic.get_multiple_by_group_id(owner.id).filter(models.Copr.unlisted_on_hp.is_(False)).all()
|
| |
+ else:
|
| |
+ coprs = ComplexLogic.get_coprs_permissible_by_user(owner)
|
| |
+ coprs = sorted(coprs, key=lambda copr: copr.full_name)
|
| |
+ selected = [copr.id for copr in pinned]
|
| |
+ selected += (app.config["PINNED_PROJECTS_LIMIT"] - len(pinned)) * [None]
|
| |
+ for i, copr_id in enumerate(form.copr_ids.data if form else []):
|
| |
+ selected[i] = int(copr_id) if copr_id else None
|
| |
+
|
| |
+ graph = BuildsLogic.get_small_graph_data('30min')
|
| |
+ return flask.render_template("pinned.html",
|
| |
+ owner=owner,
|
| |
+ pinned=pinned,
|
| |
+ selected=selected,
|
| |
+ coprs=coprs,
|
| |
+ form=form,
|
| |
+ tasks_info=ComplexLogic.get_queue_sizes(),
|
| |
+ graph=graph)
|
| |
+
|
| |
+
|
| |
+ @user_ns.route("/customize-pinned/", methods=["POST"])
|
| |
+ @user_ns.route("/customize-pinned/<group_name>", methods=["POST"])
|
| |
+ @login_required
|
| |
+ def pinned_projects_post(group_name=None):
|
| |
+ owner = flask.g.user if not group_name else ComplexLogic.get_group_by_name_safe(group_name)
|
| |
+ url_on_success = helpers.owner_url(owner)
|
| |
+ return process_pinned_projects_post(owner, url_on_success)
|
| |
+
|
| |
+
|
| |
+ def process_pinned_projects_post(owner, url_on_success):
|
| |
+ if isinstance(owner, models.Group):
|
| |
+ UsersLogic.raise_if_not_in_group(flask.g.user, owner)
|
| |
+
|
| |
+ form = PinnedCoprsForm()
|
| |
+ if not form.validate_on_submit():
|
| |
+ return render_pinned_projects(owner, form=form)
|
| |
+
|
| |
+ PinnedCoprsLogic.delete_by_owner(owner)
|
| |
+ for i, copr_id in enumerate(filter(None, form.copr_ids.data)):
|
| |
+ PinnedCoprsLogic.add(owner, int(copr_id), i)
|
| |
+ db.session.commit()
|
| |
+
|
| |
+ return flask.redirect(url_on_success)
|
| |
See #495 for the specifications.
I am sorry, that it is so awfully long PR, but the feature turned out to be much more complicated than I've originally imagined.
I was unsure where and under what route URLs put some pieces of the code ... so if you find something on a totally different place than you would expect, please let me know, I will rework it.