2018-05-17 16:18:20 +02:00
# Content DB
# Copyright (C) 2018 rubenwardy
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
2018-03-19 19:08:41 +01:00
from flask import *
from flask_user import *
from flask . ext import menu
from app import app
from app . models import *
2018-05-15 20:35:59 +02:00
from app . tasks . importtasks import importRepoScreenshot , makeVCSRelease
2018-03-19 19:08:41 +01:00
2018-05-15 20:35:59 +02:00
from app . utils import *
2018-03-23 18:33:34 +01:00
2018-05-23 21:03:51 +02:00
from celery import uuid
2018-03-20 03:58:31 +01:00
from flask_wtf import FlaskForm
from wtforms import *
2018-03-21 18:42:43 +01:00
from wtforms . validators import *
2018-04-03 15:13:11 +02:00
from wtforms . ext . sqlalchemy . fields import QuerySelectField , QuerySelectMultipleField
2018-03-20 03:58:31 +01:00
2018-03-23 18:05:07 +01:00
# TODO: the following could be made into one route, except I"m not sure how
2018-03-20 02:19:19 +01:00
# to do the menu
2018-05-13 16:56:19 +02:00
@menu.register_menu ( app , " .mods " , " Mods " , order = 11 , endpoint_arguments_constructor = lambda : { ' type ' : ' mod ' } )
@menu.register_menu ( app , " .games " , " Games " , order = 12 , endpoint_arguments_constructor = lambda : { ' type ' : ' game ' } )
@menu.register_menu ( app , " .txp " , " Texture Packs " , order = 13 , endpoint_arguments_constructor = lambda : { ' type ' : ' txp ' } )
@app.route ( " /packages/ " )
def packages_page ( ) :
type = request . args . get ( " type " )
if type is not None :
type = PackageType [ type . upper ( ) ]
2018-03-21 21:10:11 +01:00
title = " Packages "
query = Package . query
2018-03-21 21:02:53 +01:00
2018-03-21 21:10:11 +01:00
if type is not None :
title = type . value + " s "
query = query . filter_by ( type = type , approved = True )
2018-03-21 21:02:53 +01:00
2018-03-21 21:10:11 +01:00
search = request . args . get ( " q " )
if search is not None :
query = query . filter ( Package . title . contains ( search ) )
2018-03-23 18:33:34 +01:00
if shouldReturnJson ( ) :
2018-04-08 20:30:57 +02:00
pkgs = [ package . getAsDictionary ( app . config [ " BASE_URL " ] ) \
for package in query . all ( ) if package . getDownloadRelease ( ) is not None ]
return jsonify ( pkgs )
2018-03-23 18:33:34 +01:00
else :
2018-03-26 12:28:34 +02:00
tags = Tag . query . all ( )
2018-04-19 21:20:05 +02:00
return render_template ( " packages/list.html " , title = title , packages = query . all ( ) , \
query = search , tags = tags , type = None if type is None else type . toName ( ) )
2018-03-23 18:33:34 +01:00
2018-03-21 20:24:45 +01:00
@app.route ( " /todo/ " )
@login_required
def todo_page ( ) :
2018-03-21 20:53:53 +01:00
canApproveNew = Permission . APPROVE_NEW . check ( current_user )
canApproveRel = Permission . APPROVE_RELEASE . check ( current_user )
packages = None
if canApproveNew :
packages = Package . query . filter_by ( approved = False ) . all ( )
releases = None
if canApproveRel :
releases = PackageRelease . query . filter_by ( approved = False ) . all ( )
2018-03-21 23:03:37 +01:00
return render_template ( " todo.html " , title = " Reports and Work Queue " ,
2018-03-21 20:53:53 +01:00
approve_new = packages , releases = releases ,
canApproveNew = canApproveNew , canApproveRel = canApproveRel )
2018-03-21 20:24:45 +01:00
2018-03-20 19:20:30 +01:00
def getReleases ( package ) :
if package . checkPerm ( current_user , Permission . MAKE_RELEASE ) :
return package . releases
else :
return [ rel for rel in package . releases if rel . approved ]
2018-03-20 03:58:31 +01:00
2018-05-13 16:52:30 +02:00
@app.route ( " /packages/<author>/<name>/ " )
2018-05-13 19:19:50 +02:00
@is_package_page
def package_page ( package ) :
2018-03-23 18:33:34 +01:00
if shouldReturnJson ( ) :
2018-03-25 00:10:13 +01:00
return jsonify ( package . getAsDictionary ( app . config [ " BASE_URL " ] ) )
2018-03-23 18:33:34 +01:00
else :
2018-05-13 18:55:28 +02:00
clearNotifications ( package . getDetailsURL ( ) )
2018-03-23 18:33:34 +01:00
releases = getReleases ( package )
2018-03-23 20:49:57 +01:00
requests = [ r for r in package . requests if r . status == 0 ]
return render_template ( " packages/view.html " , package = package , releases = releases , requests = requests )
2018-03-23 18:33:34 +01:00
2018-03-20 03:58:31 +01:00
2018-05-13 16:52:30 +02:00
@app.route ( " /packages/<author>/<name>/download/ " )
2018-05-13 19:19:50 +02:00
@is_package_page
def package_download_page ( package ) :
2018-03-23 17:20:56 +01:00
release = package . getDownloadRelease ( )
if release is None :
2018-03-23 18:33:34 +01:00
if " application/zip " in request . accept_mimetypes and \
not " text/html " in request . accept_mimetypes :
2018-03-23 17:20:56 +01:00
return " " , 204
else :
flash ( " No download available. " , " error " )
return redirect ( package . getDetailsURL ( ) )
else :
return redirect ( release . url , code = 302 )
2018-03-20 03:58:31 +01:00
class PackageForm ( FlaskForm ) :
2018-05-21 23:20:28 +02:00
name = StringField ( " Name " , [ InputRequired ( ) , Length ( 1 , 20 ) , Regexp ( " ^[a-z0-9_] " , 0 , " Lower case letters (a-z), digits (0-9), and underscores (_) only " ) ] )
title = StringField ( " Title " , [ InputRequired ( ) , Length ( 3 , 50 ) ] )
shortDesc = StringField ( " Short Description " , [ InputRequired ( ) , Length ( 1 , 200 ) ] )
desc = TextAreaField ( " Long Description " , [ Optional ( ) , Length ( 0 , 10000 ) ] )
type = SelectField ( " Type " , [ InputRequired ( ) ] , choices = PackageType . choices ( ) , coerce = PackageType . coerce , default = PackageType . MOD )
license = QuerySelectField ( " License " , [ InputRequired ( ) ] , query_factory = lambda : License . query , get_pk = lambda a : a . id , get_label = lambda a : a . name )
2018-05-25 17:53:25 +02:00
tags = QuerySelectMultipleField ( ' Tags ' , query_factory = lambda : Tag . query . order_by ( db . asc ( Tag . name ) ) , get_pk = lambda a : a . id , get_label = lambda a : a . title )
harddeps = QuerySelectMultipleField ( ' Dependencies ' , query_factory = lambda : Package . query . join ( User ) . order_by ( db . asc ( Package . title ) , db . asc ( User . display_name ) ) , get_pk = lambda a : a . id , get_label = lambda a : a . title + " by " + a . author . display_name )
softdeps = QuerySelectMultipleField ( ' Soft Dependencies ' , query_factory = lambda : Package . query . join ( User ) . order_by ( db . asc ( Package . title ) , db . asc ( User . display_name ) ) , get_pk = lambda a : a . id , get_label = lambda a : a . title + " by " + a . author . display_name )
2018-05-21 23:20:28 +02:00
repo = StringField ( " Repo URL " , [ Optional ( ) , URL ( ) ] )
website = StringField ( " Website URL " , [ Optional ( ) , URL ( ) ] )
issueTracker = StringField ( " Issue Tracker URL " , [ Optional ( ) , URL ( ) ] )
2018-05-23 20:40:37 +02:00
forums = IntegerField ( " Forum Topic ID " , [ Optional ( ) , NumberRange ( 0 , 999999 ) ] )
2018-05-21 23:20:28 +02:00
submit = SubmitField ( " Save " )
2018-03-20 03:58:31 +01:00
2018-05-14 16:05:10 +02:00
@app.route ( " /packages/new/ " , methods = [ " GET " , " POST " ] )
2018-05-13 16:52:30 +02:00
@app.route ( " /packages/<author>/<name>/edit/ " , methods = [ " GET " , " POST " ] )
2018-03-20 03:58:31 +01:00
@login_required
2018-05-13 16:52:30 +02:00
def create_edit_package_page ( author = None , name = None ) :
2018-03-21 18:03:14 +01:00
package = None
form = None
2018-05-13 16:52:30 +02:00
if author is None :
2018-03-21 18:03:14 +01:00
form = PackageForm ( formdata = request . form )
2018-04-03 15:56:43 +02:00
author = request . args . get ( " author " )
if author is None or author == current_user . username :
author = current_user
else :
author = User . query . filter_by ( username = author ) . first ( )
if author is None :
flash ( " Unable to find that user " , " error " )
return redirect ( url_for ( " create_edit_package_page " ) )
if not author . checkPerm ( current_user , Permission . CHANGE_AUTHOR ) :
flash ( " Permission denied " , " error " )
return redirect ( url_for ( " create_edit_package_page " ) )
2018-03-21 18:03:14 +01:00
else :
2018-05-13 19:19:50 +02:00
package = getPackageByInfo ( author , name )
2018-03-21 18:03:14 +01:00
if not package . checkPerm ( current_user , Permission . EDIT_PACKAGE ) :
return redirect ( package . getDetailsURL ( ) )
2018-04-03 15:56:43 +02:00
author = package . author
2018-03-21 18:03:14 +01:00
form = PackageForm ( formdata = request . form , obj = package )
2018-03-20 03:58:31 +01:00
# Initial form class from post data and default data
if request . method == " POST " and form . validate ( ) :
2018-05-15 20:35:59 +02:00
wasNew = False
2018-03-21 18:03:14 +01:00
if not package :
2018-05-24 02:19:26 +02:00
package = Package . query . filter_by ( name = form [ " name " ] . data , author_id = author . id ) . first ( )
2018-05-24 02:09:08 +02:00
if package is not None :
flash ( " Package already exists! " , " error " )
return redirect ( url_for ( " create_edit_package_page " ) )
2018-03-21 18:03:14 +01:00
package = Package ( )
2018-04-03 15:56:43 +02:00
package . author = author
2018-05-15 20:35:59 +02:00
wasNew = True
2018-05-13 18:55:28 +02:00
else :
triggerNotif ( package . author , current_user ,
" {} edited " . format ( package . title ) , package . getDetailsURL ( ) )
2018-03-21 18:03:14 +01:00
2018-04-03 15:56:43 +02:00
form . populate_obj ( package ) # copy to row
2018-03-26 13:42:35 +02:00
package . tags . clear ( )
for tag in form . tags . raw_data :
package . tags . append ( Tag . query . get ( tag ) )
2018-03-20 03:58:31 +01:00
db . session . commit ( ) # save
2018-05-15 20:35:59 +02:00
2018-05-24 20:02:27 +02:00
if wasNew and package . canImportScreenshot ( ) :
task = importRepoScreenshot . delay ( package . id )
return redirect ( url_for ( " check_task " , id = task . id , r = package . getDetailsURL ( ) ) )
2018-05-15 20:35:59 +02:00
return redirect ( package . getDetailsURL ( ) )
2018-03-20 03:58:31 +01:00
2018-05-24 02:04:25 +02:00
enableWizard = name is None and request . method != " POST "
return render_template ( " packages/create_edit.html " , package = package , \
form = form , author = author , enable_wizard = enableWizard )
2018-03-20 19:40:19 +01:00
2018-05-13 19:37:57 +02:00
@app.route ( " /packages/<author>/<name>/approve/ " , methods = [ " POST " ] )
2018-03-21 20:03:14 +01:00
@login_required
2018-05-13 19:19:50 +02:00
@is_package_page
def approve_package_page ( package ) :
2018-03-21 20:03:14 +01:00
if not package . checkPerm ( current_user , Permission . APPROVE_NEW ) :
flash ( " You don ' t have permission to do that. " , " error " )
elif package . approved :
flash ( " Package has already been approved " , " error " )
else :
package . approved = True
2018-05-13 18:55:28 +02:00
triggerNotif ( package . author , current_user ,
" {} approved " . format ( package . title ) , package . getDetailsURL ( ) )
db . session . commit ( )
2018-03-21 20:03:14 +01:00
return redirect ( package . getDetailsURL ( ) )
2018-03-20 19:40:19 +01:00
2018-03-26 11:52:25 +02:00
class CreateScreenshotForm ( FlaskForm ) :
title = StringField ( " Title/Caption " , [ Optional ( ) ] )
fileUpload = FileField ( " File Upload " , [ InputRequired ( ) ] )
submit = SubmitField ( " Save " )
2018-05-13 16:52:30 +02:00
@app.route ( " /packages/<author>/<name>/screenshots/new/ " , methods = [ " GET " , " POST " ] )
2018-03-26 11:52:25 +02:00
@login_required
2018-05-13 19:19:50 +02:00
@is_package_page
def create_screenshot_page ( package ) :
2018-03-26 11:52:25 +02:00
if not package . checkPerm ( current_user , Permission . MAKE_RELEASE ) :
return redirect ( package . getDetailsURL ( ) )
# Initial form class from post data and default data
form = CreateScreenshotForm ( )
if request . method == " POST " and form . validate ( ) :
uploadedPath = doFileUpload ( form . fileUpload . data , [ " png " , " jpg " , " jpeg " ] ,
" a PNG or JPG image file " )
if uploadedPath is not None :
ss = PackageScreenshot ( )
ss . package = package
ss . title = form [ " title " ] . data
ss . url = uploadedPath
db . session . add ( ss )
2018-05-13 18:55:28 +02:00
msg = " {} : Screenshot added {} " \
. format ( package . title , ss . title )
2018-05-13 21:30:05 +02:00
triggerNotif ( package . author , current_user , msg , package . getDetailsURL ( ) )
2018-03-26 11:52:25 +02:00
db . session . commit ( )
return redirect ( package . getDetailsURL ( ) )
return render_template ( " packages/screenshot_new.html " , package = package , form = form )
2018-03-23 20:08:55 +01:00
class EditRequestForm ( PackageForm ) :
edit_title = StringField ( " Edit Title " , [ InputRequired ( ) , Length ( 1 , 100 ) ] )
edit_desc = TextField ( " Edit Description " , [ Optional ( ) ] )
2018-05-13 16:52:30 +02:00
@app.route ( " /packages/<author>/<name>/requests/new/ " , methods = [ " GET " , " POST " ] )
@app.route ( " /packages/<author>/<name>/requests/<id>/edit/ " , methods = [ " GET " , " POST " ] )
2018-03-23 20:08:55 +01:00
@login_required
2018-05-13 19:19:50 +02:00
@is_package_page
def create_edit_editrequest_page ( package , id = None ) :
2018-05-13 16:40:37 +02:00
edited_package = package
2018-03-23 20:08:55 +01:00
2018-05-13 16:40:37 +02:00
erequest = None
if id is not None :
erequest = EditRequest . query . get ( id )
if erequest . package != package :
abort ( 404 )
from copy import copy
edited_package = copy ( package )
erequest . applyAll ( edited_package )
if not erequest . checkPerm ( current_user , Permission . EDIT_EDITREQUEST ) :
abort ( 403 )
if erequest . status != 0 :
flash ( " Can ' t edit EditRequest, it has already been merged or rejected " , " error " )
return redirect ( erequest . getURL ( ) )
form = EditRequestForm ( request . form , obj = edited_package )
2018-03-23 20:08:55 +01:00
if request . method == " POST " and form . validate ( ) :
2018-05-13 16:40:37 +02:00
if erequest is None :
erequest = EditRequest ( )
erequest . package = package
erequest . author = current_user
2018-04-03 15:13:11 +02:00
erequest . title = form [ " edit_title " ] . data
erequest . desc = form [ " edit_desc " ] . data
2018-03-23 20:08:55 +01:00
db . session . add ( erequest )
2018-05-13 16:40:37 +02:00
EditRequestChange . query . filter_by ( request = erequest ) . delete ( )
2018-03-23 20:08:55 +01:00
wasChangeMade = False
for e in PackagePropertyKey :
2018-04-03 15:13:11 +02:00
newValue = form [ e . name ] . data
2018-03-23 20:08:55 +01:00
oldValue = getattr ( package , e . name )
newValueComp = newValue
oldValueComp = oldValue
if type ( newValue ) is str :
newValue = newValue . replace ( " \r \n " , " \n " )
newValueComp = newValue . strip ( )
2018-03-23 20:49:57 +01:00
oldValueComp = " " if oldValue is None else oldValue . strip ( )
2018-03-23 20:08:55 +01:00
if newValueComp != oldValueComp :
change = EditRequestChange ( )
change . request = erequest
change . key = e
2018-03-26 16:17:39 +02:00
change . oldValue = e . convert ( oldValue )
change . newValue = e . convert ( newValue )
2018-03-23 20:08:55 +01:00
db . session . add ( change )
wasChangeMade = True
if wasChangeMade :
2018-05-13 18:55:28 +02:00
msg = " {} : Edit request # {} {} " \
. format ( package . title , erequest . id , " created " if id is None else " edited " )
triggerNotif ( package . author , current_user , msg , erequest . getURL ( ) )
triggerNotif ( erequest . author , current_user , msg , erequest . getURL ( ) )
2018-03-23 20:08:55 +01:00
db . session . commit ( )
2018-03-23 20:49:57 +01:00
return redirect ( erequest . getURL ( ) )
2018-03-23 20:08:55 +01:00
else :
flash ( " No changes detected " , " warning " )
2018-05-13 16:40:37 +02:00
elif erequest is not None :
form [ " edit_title " ] . data = erequest . title
form [ " edit_desc " ] . data = erequest . desc
2018-03-23 20:08:55 +01:00
2018-05-13 16:40:37 +02:00
return render_template ( " packages/editrequest_create_edit.html " , package = package , form = form )
2018-03-23 20:25:48 +01:00
2018-05-13 16:52:30 +02:00
@app.route ( " /packages/<author>/<name>/requests/<id>/ " )
2018-05-13 19:19:50 +02:00
@is_package_page
def view_editrequest_page ( package , id ) :
2018-03-26 13:55:41 +02:00
erequest = EditRequest . query . get ( id )
2018-05-13 19:19:50 +02:00
if erequest is None or erequest . package != package :
2018-03-23 20:25:48 +01:00
abort ( 404 )
2018-05-13 18:55:28 +02:00
clearNotifications ( erequest . getURL ( ) )
2018-03-23 20:25:48 +01:00
return render_template ( " packages/editrequest_view.html " , package = package , request = erequest )
2018-03-23 20:08:55 +01:00
2018-05-13 19:37:57 +02:00
@app.route ( " /packages/<author>/<name>/requests/<id>/approve/ " , methods = [ " POST " ] )
2018-05-13 19:19:50 +02:00
@is_package_page
def approve_editrequest_page ( package , id ) :
2018-03-23 20:49:57 +01:00
if not package . checkPerm ( current_user , Permission . APPROVE_CHANGES ) :
flash ( " You don ' t have permission to do that. " , " error " )
return redirect ( package . getDetailsURL ( ) )
2018-03-26 13:55:41 +02:00
erequest = EditRequest . query . get ( id )
2018-05-13 19:19:50 +02:00
if erequest is None or erequest . package != package :
2018-03-23 20:49:57 +01:00
abort ( 404 )
if erequest . status != 0 :
flash ( " Edit request has already been resolved " , " error " )
else :
erequest . status = 1
erequest . applyAll ( package )
2018-05-13 18:55:28 +02:00
msg = " {} : Edit request # {} merged " . format ( package . title , erequest . id )
triggerNotif ( erequest . author , current_user , msg , erequest . getURL ( ) )
triggerNotif ( package . author , current_user , msg , erequest . getURL ( ) )
2018-03-23 20:49:57 +01:00
db . session . commit ( )
return redirect ( package . getDetailsURL ( ) )
2018-05-13 19:37:57 +02:00
@app.route ( " /packages/<author>/<name>/requests/<id>/reject/ " , methods = [ " POST " ] )
2018-05-13 19:19:50 +02:00
@is_package_page
def reject_editrequest_page ( package , id ) :
2018-03-23 20:49:57 +01:00
if not package . checkPerm ( current_user , Permission . APPROVE_CHANGES ) :
flash ( " You don ' t have permission to do that. " , " error " )
return redirect ( package . getDetailsURL ( ) )
2018-03-26 13:55:41 +02:00
erequest = EditRequest . query . get ( id )
2018-05-13 19:19:50 +02:00
if erequest is None or erequest . package != package :
2018-03-23 20:49:57 +01:00
abort ( 404 )
if erequest . status != 0 :
flash ( " Edit request has already been resolved " , " error " )
else :
erequest . status = 2
2018-05-13 18:55:28 +02:00
msg = " {} : Edit request # {} rejected " . format ( package . title , erequest . id )
triggerNotif ( erequest . author , current_user , msg , erequest . getURL ( ) )
triggerNotif ( package . author , current_user , msg , erequest . getURL ( ) )
2018-03-23 20:49:57 +01:00
db . session . commit ( )
return redirect ( package . getDetailsURL ( ) )
2018-03-21 17:41:34 +01:00
class CreatePackageReleaseForm ( FlaskForm ) :
2018-03-23 20:08:55 +01:00
name = StringField ( " Name " )
title = StringField ( " Title " )
2018-05-24 20:02:27 +02:00
uploadOpt = RadioField ( " Method " , choices = [ ( " upload " , " File Upload " ) ] , default = " upload " )
2018-03-23 20:08:55 +01:00
vcsLabel = StringField ( " VCS Commit or Branch " , default = " master " )
fileUpload = FileField ( " File Upload " )
2018-03-23 18:05:07 +01:00
submit = SubmitField ( " Save " )
2018-03-20 19:40:19 +01:00
2018-03-21 17:41:34 +01:00
class EditPackageReleaseForm ( FlaskForm ) :
2018-03-23 20:08:55 +01:00
name = StringField ( " Name " )
title = StringField ( " Title " )
url = StringField ( " URL " , [ URL ] )
2018-05-23 20:17:44 +02:00
task_id = StringField ( " Task ID " )
2018-03-23 20:08:55 +01:00
approved = BooleanField ( " Is Approved " )
submit = SubmitField ( " Save " )
2018-03-21 17:41:34 +01:00
2018-05-13 16:52:30 +02:00
@app.route ( " /packages/<author>/<name>/releases/new/ " , methods = [ " GET " , " POST " ] )
2018-03-20 19:40:19 +01:00
@login_required
2018-05-13 19:19:50 +02:00
@is_package_page
def create_release_page ( package ) :
2018-03-20 19:40:19 +01:00
if not package . checkPerm ( current_user , Permission . MAKE_RELEASE ) :
return redirect ( package . getDetailsURL ( ) )
# Initial form class from post data and default data
2018-03-23 18:05:07 +01:00
form = CreatePackageReleaseForm ( )
2018-05-24 20:02:27 +02:00
if package . canMakeReleaseFromVCS ( ) :
form [ " uploadOpt " ] . choices = [ ( " vcs " , " From VCS Commit or Branch " ) , ( " upload " , " File Upload " ) ]
if request . method != " POST " :
form [ " uploadOpt " ] . data = " vcs "
2018-03-20 19:40:19 +01:00
if request . method == " POST " and form . validate ( ) :
if form [ " uploadOpt " ] . data == " vcs " :
rel = PackageRelease ( )
rel . package = package
2018-05-11 16:04:17 +02:00
rel . title = form [ " title " ] . data
rel . url = " "
2018-05-23 21:03:51 +02:00
rel . task_id = uuid ( )
2018-05-24 20:15:13 +02:00
db . session . add ( rel )
2018-03-20 19:40:19 +01:00
db . session . commit ( )
2018-05-11 16:04:17 +02:00
2018-05-23 21:03:51 +02:00
makeVCSRelease . apply_async ( ( rel . id , form [ " vcsLabel " ] . data ) , task_id = rel . task_id )
2018-05-13 18:55:28 +02:00
msg = " {} : Release {} created " . format ( package . title , rel . title )
triggerNotif ( package . author , current_user , msg , rel . getEditURL ( ) )
2018-05-11 16:04:17 +02:00
db . session . commit ( )
2018-05-23 20:17:44 +02:00
return redirect ( url_for ( " check_task " , id = rel . task_id , r = rel . getEditURL ( ) ) )
2018-03-20 19:40:19 +01:00
else :
2018-03-26 11:52:25 +02:00
uploadedPath = doFileUpload ( form . fileUpload . data , [ " zip " ] , " a zip file " )
if uploadedPath is not None :
2018-03-23 18:05:07 +01:00
rel = PackageRelease ( )
rel . package = package
rel . title = form [ " title " ] . data
2018-03-26 11:52:25 +02:00
rel . url = uploadedPath
db . session . add ( rel )
2018-05-24 20:15:13 +02:00
db . session . commit ( )
2018-05-13 18:55:28 +02:00
msg = " {} : Release {} created " . format ( package . title , rel . title )
2018-05-13 21:30:05 +02:00
triggerNotif ( package . author , current_user , msg , rel . getEditURL ( ) )
2018-03-23 18:05:07 +01:00
db . session . commit ( )
return redirect ( package . getDetailsURL ( ) )
2018-03-20 19:40:19 +01:00
2018-03-23 15:07:13 +01:00
return render_template ( " packages/release_new.html " , package = package , form = form )
2018-03-21 17:41:34 +01:00
2018-05-13 16:52:30 +02:00
@app.route ( " /packages/<author>/<name>/releases/<id>/ " , methods = [ " GET " , " POST " ] )
2018-03-21 17:41:34 +01:00
@login_required
2018-05-13 19:19:50 +02:00
@is_package_page
def edit_release_page ( package , id ) :
2018-03-26 13:55:41 +02:00
release = PackageRelease . query . get ( id )
2018-05-13 19:55:08 +02:00
if release is None or release . package != package :
2018-03-21 17:41:34 +01:00
abort ( 404 )
2018-05-13 18:55:28 +02:00
clearNotifications ( release . getEditURL ( ) )
2018-03-23 18:05:07 +01:00
canEdit = package . checkPerm ( current_user , Permission . MAKE_RELEASE )
2018-03-21 17:41:34 +01:00
canApprove = package . checkPerm ( current_user , Permission . APPROVE_RELEASE )
if not ( canEdit or canApprove ) :
return redirect ( package . getDetailsURL ( ) )
# Initial form class from post data and default data
form = EditPackageReleaseForm ( formdata = request . form , obj = release )
if request . method == " POST " and form . validate ( ) :
wasApproved = release . approved
if canEdit :
release . title = form [ " title " ] . data
if package . checkPerm ( current_user , Permission . CHANGE_RELEASE_URL ) :
release . url = form [ " url " ] . data
2018-05-23 20:17:44 +02:00
release . task_id = form [ " task_id " ] . data
if release . task_id . strip ( ) == " " :
release . task_id = None
2018-03-21 17:41:34 +01:00
if canApprove :
release . approved = form [ " approved " ] . data
else :
release . approved = wasApproved
db . session . commit ( )
return redirect ( package . getDetailsURL ( ) )
2018-03-23 15:07:13 +01:00
return render_template ( " packages/release_edit.html " , package = package , release = release , form = form )