1 import time
2
3 import flask
4 import sqlalchemy
5
6 from coprs import db
7 from coprs import exceptions
8 from coprs import forms
9 from coprs import helpers
10 from coprs import models
11
12 from coprs.views.misc import login_required, page_not_found
13
14 from coprs.views.coprs_ns import coprs_ns
15
16 from coprs.logic import builds_logic
17 from coprs.logic import coprs_logic
18
19
20 @coprs_ns.route('/', defaults = {'page': 1})
21 @coprs_ns.route('/<int:page>/')
22 -def coprs_show(page=1):
28
29
30 @coprs_ns.route('/<username>/', defaults = {'page': 1})
31 @coprs_ns.route('/<username>/<int:page>/')
32 -def coprs_by_owner(username=None, page=1):
41
42
43 @coprs_ns.route('/<username>/allowed/', defaults = {'page': 1})
44 @coprs_ns.route('/<username>/allowed/<int:page>/')
45 -def coprs_by_allowed(username=None, page=1):
54
55
56 @coprs_ns.route('/fulltext/', defaults = {'page': 1})
57 @coprs_ns.route('/fulltext/<int:page>/')
58 -def coprs_fulltext_search(page=1):
59 fulltext = flask.request.args.get('fulltext', '')
60 query = coprs_logic.CoprsLogic.get_multiple_fulltext(flask.g.user, fulltext)
61 paginator = helpers.Paginator(query, query.count(), page)
62
63 coprs = paginator.sliced_query
64 return flask.render_template('coprs/show.html',
65 coprs=coprs,
66 paginator=paginator,
67 fulltext=fulltext)
68
69
70 @coprs_ns.route('/<username>/add/')
71 @login_required
72 -def copr_add(username):
76
77
78 @coprs_ns.route('/<username>/new/', methods=['POST'])
79 @login_required
80 -def copr_new(username):
81 """ Receive information from the user on how to create its new copr
82 and create it accordingly.
83 """
84 form = forms.CoprFormFactory.create_form_cls()()
85 if form.validate_on_submit():
86 copr = coprs_logic.CoprsLogic.add(flask.g.user,
87 name=form.name.data,
88 repos=form.repos.data.replace('\n', ' '),
89 selected_chroots=form.selected_chroots,
90 description=form.description.data,
91 instructions=form.instructions.data)
92 db.session.commit()
93 flask.flash('New copr was successfully created.')
94
95 if form.initial_pkgs.data:
96 builds_logic.BuildsLogic.add(flask.g.user,
97 pkgs=form.initial_pkgs.data.replace('\n', ' '),
98 copr=copr)
99 db.session.commit()
100 flask.flash('Initial packages were successfully submitted '
101 'for building.')
102
103 return flask.redirect(flask.url_for('coprs_ns.copr_detail', username=flask.g.user.name, coprname=copr.name))
104 else:
105 return flask.render_template('coprs/add.html', form = form)
106
107
108 @coprs_ns.route('/<username>/<coprname>/')
109 -def copr_detail(username, coprname):
110 query = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname, with_mock_chroots=True)
111 form = forms.CoprLegalFlagForm()
112 try:
113 copr = query.one()
114 except sqlalchemy.orm.exc.NoResultFound:
115 return page_not_found('Copr with name {0} does not exist.'.format(coprname))
116
117 return flask.render_template('coprs/detail/overview.html',
118 copr=copr,
119 form=form)
120
121
122 @coprs_ns.route('/<username>/<coprname>/permissions/')
123 -def copr_permissions(username, coprname):
152
153
154 @coprs_ns.route('/<username>/<coprname>/edit/')
155 @login_required
156 -def copr_edit(username, coprname, form=None):
168
169
170 @coprs_ns.route('/<username>/<coprname>/update/', methods = ['POST'])
171 @login_required
172 -def copr_update(username, coprname):
173 form = forms.CoprFormFactory.create_form_cls()()
174 copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first()
175
176 if form.validate_on_submit():
177
178 copr.name = form.name.data
179 copr.repos = form.repos.data.replace('\n', ' ')
180 copr.description = form.description.data
181 copr.instructions = form.instructions.data
182 coprs_logic.CoprChrootsLogic.update_from_names(flask.g.user, copr, form.selected_chroots)
183
184 try:
185 coprs_logic.CoprsLogic.update(flask.g.user, copr, check_for_duplicates = False)
186 except (exceptions.ActionInProgressException, exceptions.InsufficientRightsException) as e:
187 flask.flash(e)
188 db.session.rollback()
189 else:
190 flask.flash('Copr was updated successfully.')
191 db.session.commit()
192
193 return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = username, coprname = copr.name))
194 else:
195 return copr_edit(username, coprname, form)
196
197
198 @coprs_ns.route('/<username>/<coprname>/permissions_applier_change/', methods = ['POST'])
199 @login_required
200 -def copr_permissions_applier_change(username, coprname):
201 copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first()
202 permission = coprs_logic.CoprPermissionsLogic.get(flask.g.user, copr, flask.g.user).first()
203 applier_permissions_form = forms.PermissionsApplierFormFactory.create_form_cls(permission)()
204
205 if not copr:
206 return page_not_found('Copr with name {0} does not exist.'.format(name))
207 if copr.owner == flask.g.user:
208 flask.flash('Owner cannot request permissions for his own copr.')
209 elif applier_permissions_form.validate_on_submit():
210
211 new_builder = applier_permissions_form.copr_builder.data
212 new_admin = applier_permissions_form.copr_admin.data
213 coprs_logic.CoprPermissionsLogic.update_permissions_by_applier(flask.g.user, copr, permission, new_builder, new_admin)
214 db.session.commit()
215 flask.flash('Successfuly updated permissions do Copr "{0}".'.format(copr.name))
216
217 return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = copr.owner.name, coprname = copr.name))
218
219
220 @coprs_ns.route('/<username>/<coprname>/update_permissions/', methods = ['POST'])
221 @login_required
222 -def copr_update_permissions(username, coprname):
247
248
249 @coprs_ns.route('/<username>/<coprname>/delete/', methods=['GET', 'POST'])
250 @login_required
251 -def copr_delete(username, coprname):
268
269
270 @coprs_ns.route('/<username>/<coprname>/legal_flag/', methods=['POST'])
271 @login_required
272 -def copr_legal_flag(username, coprname):
284
285
286 @coprs_ns.route('/<username>/<coprname>/repo/')
287 -def generate_repo_file(username, coprname):
288 ''' Generate repo file for a given repo name.
289 Reponame = username-coprname '''
290
291
292
293
294 reponame = "%s-%s" % (username, coprname)
295
296 if '-' not in reponame:
297 return page_not_found('Bad repository name: {0}. Must be username-coprname'.format(reponame))
298
299 username, coprname = reponame.split('-', 1)
300 copr = None
301 try:
302
303 copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname,
304 with_builds=True).one()
305 except sqlalchemy.orm.exc.NoResultFound:
306 return page_not_found('Copr {0}/{1} does not exist'.format(username, coprname))
307
308 url = ''
309 for build in copr.builds:
310 if build.results:
311 url = build.results
312 break
313
314 if not url:
315 return page_not_found('Repository not initialized: No finished builds in {0}/{1}.'.format(username, coprname))
316
317 response = flask.make_response(flask.render_template('coprs/copr.repo', copr=copr, url=url))
318 response.mimetype='text/plain'
319 return response
320