Template fixes.

- Use PATCH request for user profile update.
This commit is contained in:
Emanuel Schuetze 2016-01-10 10:52:44 +01:00
parent 7dd9edec8b
commit f9f3af245e
8 changed files with 92 additions and 52 deletions

View File

@ -1,5 +1,6 @@
import mimetypes
from django.conf import settings
from django.db import models as dbmodels
from ..utils.rest_api import FileField, ModelSerializer, SerializerMethodField
@ -26,6 +27,7 @@ class MediafileSerializer(ModelSerializer):
"""
Serializer for mediafile.models.Mediafile objects.
"""
media_url_prefix = SerializerMethodField()
filesize = SerializerMethodField()
def __init__(self, *args, **kwargs):
@ -42,9 +44,13 @@ class MediafileSerializer(ModelSerializer):
'id',
'title',
'mediafile',
'media_url_prefix',
'uploader',
'filesize',
'timestamp',)
def get_filesize(self, mediafile):
return mediafile.get_filesize()
def get_media_url_prefix(self, mediafile):
return settings.MEDIA_URL

View File

@ -4,24 +4,40 @@
angular.module('OpenSlidesApp.mediafiles', [])
.factory('Mediafile', ['DS', function(DS) {
return DS.defineResource({
name: 'mediafiles/mediafile',
computed: {
is_presentable: ['filetype', function (filetype) {
var PRESENTABLE_FILE_TYPES = ['application/pdf'];
return _.contains(PRESENTABLE_FILE_TYPES, filetype);
}],
filename: [function () {
var filename = this.mediafile.name;
return /\/(.+?)$/.exec(filename)[1];
}],
title_or_filename: ['title', 'mediafile', function (title) {
return title || this.filename;
}]
}
});
}])
.factory('Mediafile', [
'DS',
'jsDataModel',
function(DS, jsDataModel) {
var name = 'mediafiles/mediafile';
return DS.defineResource({
name: name,
computed: {
is_presentable: ['filetype', function (filetype) {
var PRESENTABLE_FILE_TYPES = ['application/pdf'];
return _.contains(PRESENTABLE_FILE_TYPES, filetype);
}],
mediafileUrl: [function () {
return this.media_url_prefix + this.mediafile.name;
}],
filename: [function () {
var filename = this.mediafile.name;
return /\/(.+?)$/.exec(filename)[1];
}],
title_or_filename: ['title', 'mediafile', function (title) {
return title || this.filename;
}]
},
relations: {
belongsTo: {
'users/user': {
localField: 'uploader',
localKey: 'uploader_id',
}
}
}
});
}
])
.run(['Mediafile', function(Mediafile) {}]);

View File

@ -82,22 +82,39 @@ angular.module('OpenSlidesApp.mediafiles.site', ['ngFileUpload', 'OpenSlidesApp.
};
})
.controller('MediafileCreateCtrl', function($scope, $state, $timeout, Upload) {
$scope.mediafile = {};
$scope.save = uploadFile($timeout, $scope, $state, Upload);
})
.controller('MediafileCreateCtrl', [
'$scope',
'$state',
'$timeout',
'operator',
'Upload',
function($scope, $state, $timeout, operator, Upload) {
$scope.mediafile = {};
$scope.save = uploadFile($timeout, $scope, $state, operator, Upload);
}
])
.controller('MediafileUpdateCtrl', function($scope, $state, $timeout, Upload, Mediafile, mediafile) {
$scope.mediafile = mediafile;
$scope.save = uploadFile($timeout, $scope, $state, Upload, mediafile);
});
.controller('MediafileUpdateCtrl', [
'$scope',
'$state',
'$timeout',
'operator',
'Upload',
'Mediafile',
'mediafile',
function($scope, $state, $timeout, operator, Upload, Mediafile, mediafile) {
$scope.mediafile = mediafile;
$scope.save = uploadFile($timeout, $scope, $state, operator, Upload, mediafile);
}
]);
function uploadFile($timeout, $scope, $state, Upload, mediafile) {
function uploadFile($timeout, $scope, $state, operator, Upload, mediafile) {
console.log(operator.user);
return function(file) {
file.upload = Upload.upload({
url: '/rest/mediafiles/mediafile/' + (mediafile ? mediafile.id : ''),
method: mediafile ? 'PUT' : 'POST',
data: {mediafile: file.newFile, title: file.title}
data: {mediafile: file.newFile, title: file.title, uploader_id: operator.user.id}
});
file.upload.then(function (response) {

View File

@ -53,11 +53,11 @@
<tbody>
<tr ng-repeat="mediafile in mediafiles | filter: filter.search |
orderBy: sortColumn:reverse">
<td><a ng-href="/media/{{ mediafile.mediafile.name }}" target="_self">{{ mediafile.title_or_filename }}</a>
<td><a ng-href="{{ mediafile.mediafileUrl }}" target="_blank">{{ mediafile.title_or_filename }}</a>
<td class="optional">{{ mediafile.mediafile.type }}
<td>{{ mediafile.filesize }}
<td>{{ mediafile.timestamp }}
<td>{{ mediafile.uploader }}
<td>{{ mediafile.uploader.get_full_name() }}
<td os-perms="mediafiles.can_manage core.can_manage_projector" class="nobr">
<!-- projector, TODO: add link to activate slide -->
<a href="#TODO" ng-if="mediafile.is_presentable" os-perms-lite="core.can_manage_projector"

View File

@ -164,7 +164,7 @@ angular.module('OpenSlidesApp.motions', ['OpenSlidesApp.users'])
'operator',
'Config',
function(DS, MotionPoll, jsDataModel, gettext, operator, Config) {
var name = 'motions/motion'
var name = 'motions/motion';
return DS.defineResource({
name: name,
useClass: jsDataModel,

View File

@ -71,11 +71,11 @@
</div>
<div class="col-sm-4">
<!-- Category -->
<h3 translate>Category</h3>
{{ motion.category.name }}</a>
<h3 ng-if="motion.category" translate>Category</h3>
{{ motion.category.name }}
<!-- Tags -->
<h3 translate>Tags</h3>
<h3 ng-if="motion.tags.length > 0" translate>Tags</h3>
<span ng-repeat="tag in motion.tags">
{{ tag.name }}{{$last ? '' : ', '}}
</span>
@ -100,11 +100,11 @@
</div>
</div>
<div class="col-sm-3">
<h3 translate>Voting result</h3>
<h3 ng-if="motion.polls.length > 0" translate>Voting result</h3>
<ol class="slimlist">
<li ng-repeat="poll in motion.polls" class="spacer">
<translate>Vote</translate>
<button os-perms-lite="motions.can_manage" ng-click="poll.isEditMode=true;"
<button os-perms="motions.can_manage" ng-click="$parent.poll.isEditMode=true;"
class="btn btn-default btn-xs">
<i class="fa fa-pencil"></i>
</button>
@ -163,7 +163,7 @@
</div>
</form>
</div>
<div ng-show="!poll.isEditMode && poll.yes >= -2" class="pollresults">
<div ng-show="!poll.isEditMode" class="pollresults">
<!-- yes -->
<div class="result_label">
<i class="fa fa-thumbs-up"></i>
@ -240,16 +240,16 @@
<div class="white-space-pre-line" ng-bind-html="motion.getReason()"></div>
</div>
<!-- attachments
TODO: make 'motion.attachments' useable and itteratable in template
<div ng-if="motion.attachments">
<h3 translate>Attachments</h3>
</div>
-->
<!-- attachments -->
<h3 ng-if="motion.attachments.length > 0" translate>Attachments</h3>
<ul>
<li ng-repeat="attachment in motion.attachments">
<a href="{{ attachment.mediafileUrl }}" target="_blank">{{ attachment.title_or_filename }}</a>
</ul>
<!-- log -->
<button type="button" class="btn btn-default spacer" ng-click="isCollapsed = !isCollapsed" translate>
Show log
Show history
</button>
<div uib-collapse="isCollapsed">
<div class="well well-sm">

View File

@ -546,7 +546,7 @@ angular.module('OpenSlidesApp.users.site', ['OpenSlidesApp.users'])
function($scope, $state, User, user) {
$scope.user = user; // autoupdate is not activated
$scope.save = function (user) {
User.save(user).then(
User.save(user, { method: 'PATCH' }).then(
function(success) {
$state.go('users.user.list');
},

View File

@ -37,9 +37,9 @@ class UserViewSet(ModelViewSet):
"""
Returns True if the user has required permissions.
"""
if self.action in ('metadata', 'list', 'retrieve', 'partial_update'):
if self.action in ('metadata', 'list', 'retrieve', 'update', 'partial_update'):
result = self.request.user.has_perm('users.can_see_name')
elif self.action in ('create', 'update', 'destroy', 'reset_password'):
elif self.action in ('create', 'destroy', 'reset_password'):
result = (self.request.user.has_perm('users.can_see_name') and
self.request.user.has_perm('users.can_see_extra_data') and
self.request.user.has_perm('users.can_manage'))
@ -121,12 +121,13 @@ class UserViewSet(ModelViewSet):
'title',
'first_name',
'last_name',
'structure_level'
'structure_level',
'about_me',)
for data in request.data.keys():
if data not in whitelist:
# Non-staff users are allowed to send only some data.
self.permission_denied(request)
keys = list(request.data.keys())
for key in keys:
if key not in whitelist:
# Non-staff users are allowed to send only some data. Ignore other data.
del request.data[key]
# Validate data and update user.
serializer = self.get_serializer(
user,