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 @coprs_ns.route('/', defaults = {'page': 1})
20 @coprs_ns.route('/<int:page>/')
21 -def coprs_show(page=1):
27
28
29 @coprs_ns.route('/owned/<username>/', defaults = {'page': 1})
30 @coprs_ns.route('/owned/<username>/<int:page>/')
31 -def coprs_by_owner(username=None, page=1):
40
41
42 @coprs_ns.route('/allowed/<username>/', defaults = {'page': 1})
43 @coprs_ns.route('/allowed/<username>/<int:page>/')
44 -def coprs_by_allowed(username=None, page=1):
53
54 @coprs_ns.route('/fulltext/', defaults = {'page': 1})
55 @coprs_ns.route('/fulltext/<int:page>/')
56 -def coprs_fulltext_search(page=1):
57 fulltext = flask.request.args.get('fulltext', '')
58 query = coprs_logic.CoprsLogic.get_multiple_fulltext(flask.g.user, fulltext)
59 paginator = helpers.Paginator(query, query.count(), page)
60
61 coprs = paginator.sliced_query
62 return flask.render_template('coprs/show.html',
63 coprs=coprs,
64 paginator=paginator,
65 fulltext=fulltext)
66
67 @coprs_ns.route('/add/')
68 @login_required
69 -def copr_add():
73
74
75 @coprs_ns.route('/new/', methods=['POST'])
76 @login_required
77 -def copr_new():
78 """ Receive information from the user on how to create its new copr
79 and create it accordingly.
80 """
81 form = forms.CoprFormFactory.create_form_cls()()
82 if form.validate_on_submit():
83 copr = coprs_logic.CoprsLogic.add(flask.g.user,
84 name=form.name.data,
85 repos=form.repos.data.replace('\n', ' '),
86 selected_chroots=form.selected_chroots,
87 description=form.description.data,
88 instructions=form.instructions.data)
89 db.session.commit()
90 flask.flash('New copr was successfully created.')
91
92 if form.initial_pkgs.data:
93 builds_logic.BuildsLogic.add(flask.g.user,
94 pkgs=form.initial_pkgs.data.replace('\n', ' '),
95 copr=copr)
96 db.session.commit()
97 flask.flash('Initial packages were successfully submitted '
98 'for building.')
99
100 return flask.redirect(flask.url_for('coprs_ns.copr_detail', username=flask.g.user.name, coprname=copr.name))
101 else:
102 return flask.render_template('coprs/add.html', form = form)
103
104 @coprs_ns.route('/detail/<username>/<coprname>/')
105 -def copr_detail(username, coprname):
106 query = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname, with_mock_chroots=True)
107 form = forms.CoprLegalFlagForm()
108 try:
109 copr = query.one()
110 except sqlalchemy.orm.exc.NoResultFound:
111 return page_not_found('Copr with name {0} does not exist.'.format(coprname))
112
113 return flask.render_template('coprs/detail/overview.html',
114 copr=copr,
115 form=form)
116
117 @coprs_ns.route('/detail/<username>/<coprname>/permissions/')
118 -def copr_permissions(username, coprname):
147
148 @coprs_ns.route('/detail/<username>/<coprname>/edit/')
149 @login_required
150 -def copr_edit(username, coprname, form=None):
162
163
164 @coprs_ns.route('/detail/<username>/<coprname>/update/', methods = ['POST'])
165 @login_required
166 -def copr_update(username, coprname):
167 form = forms.CoprFormFactory.create_form_cls()()
168 copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first()
169
170 if form.validate_on_submit():
171
172 copr.name = form.name.data
173 copr.repos = form.repos.data.replace('\n', ' ')
174 copr.description = form.description.data
175 copr.instructions = form.instructions.data
176 coprs_logic.CoprChrootsLogic.update_from_names(flask.g.user, copr, form.selected_chroots)
177
178 try:
179 coprs_logic.CoprsLogic.update(flask.g.user, copr, check_for_duplicates = False)
180 except (exceptions.ActionInProgressException, exceptions.InsufficientRightsException) as e:
181 flask.flash(e)
182 db.session.rollback()
183 else:
184 flask.flash('Copr was updated successfully.')
185 db.session.commit()
186
187 return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = username, coprname = copr.name))
188 else:
189 return copr_edit(username, coprname, form)
190
191
192 @coprs_ns.route('/detail/<username>/<coprname>/permissions_applier_change/', methods = ['POST'])
193 @login_required
194 -def copr_permissions_applier_change(username, coprname):
195 copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first()
196 permission = coprs_logic.CoprPermissionsLogic.get(flask.g.user, copr, flask.g.user).first()
197 applier_permissions_form = forms.PermissionsApplierFormFactory.create_form_cls(permission)()
198
199 if not copr:
200 return page_not_found('Copr with name {0} does not exist.'.format(name))
201 if copr.owner == flask.g.user:
202 flask.flash('Owner cannot request permissions for his own copr.')
203 elif applier_permissions_form.validate_on_submit():
204
205 new_builder = applier_permissions_form.copr_builder.data
206 new_admin = applier_permissions_form.copr_admin.data
207 coprs_logic.CoprPermissionsLogic.update_permissions_by_applier(flask.g.user, copr, permission, new_builder, new_admin)
208 db.session.commit()
209 flask.flash('Successfuly updated permissions do Copr "{0}".'.format(copr.name))
210
211 return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = copr.owner.name, coprname = copr.name))
212
213 @coprs_ns.route('/detail/<username>/<coprname>/update_permissions/', methods = ['POST'])
214 @login_required
215 -def copr_update_permissions(username, coprname):
240
241 @coprs_ns.route('/detail/<username>/<coprname>/delete/', methods=['GET', 'POST'])
242 @login_required
243 -def copr_delete(username, coprname):
260
261 @coprs_ns.route('/detail/<username>/<coprname>/legal_flag/', methods=['POST'])
262 @login_required
263 -def copr_legal_flag(username, coprname):
275
278 ''' Generate repo file for a given repo name.
279 Reponame = username-coprname '''
280
281
282
283
284 if '-' not in reponame:
285 return page_not_found('Bad repository name: {0}. Must be username-coprname'.format(reponame))
286
287 username, coprname = reponame.split('-', 1)
288 copr = None
289 try:
290
291 copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname,
292 with_builds=True).one()
293 except sqlalchemy.orm.exc.NoResultFound:
294 return page_not_found('Copr {0}/{1} does not exist'.format(username, coprname))
295
296 url = ''
297 for build in copr.builds:
298 if build.results:
299 url = build.results
300 break
301
302 if not url:
303 return page_not_found('Repository not initialized: No finished builds in {0}/{1}.'.format(username, coprname))
304
305 response = flask.make_response(flask.render_template('coprs/copr.repo', copr=copr, url=url))
306 response.mimetype='text/plain'
307 return response
308