mirror of
https://github.com/fergalmoran/dss.git
synced 2026-01-10 10:54:17 +00:00
Release images and embed code
This commit is contained in:
13
spa/ajax.py
13
spa/ajax.py
@@ -41,6 +41,7 @@ class AjaxHandler(object):
|
||||
url(r'^facebook_post_likes_allowed/$', 'spa.ajax.facebook_post_likes_allowed',
|
||||
name='ajax_facebook_post_likes_allowed'),
|
||||
url(r'^upload_image/(?P<mix_id>\d+)/$', 'spa.ajax.upload_image', name='ajax_upload_image'),
|
||||
url(r'^upload_release_image/(?P<release_id>\d+)/$', 'spa.ajax.upload_release_image', name='ajax_upload_release_image'),
|
||||
url(r'^upload_avatar_image/$', 'spa.ajax.upload_avatar_image', name='ajax_upload_avatar_image'),
|
||||
url(r'^upload_mix_file_handler/$', 'spa.ajax.upload_mix_file_handler', name='ajax_upload_mix_file_handler'),
|
||||
url(r'^lookup/$', 'spa.ajax.lookup', name='ajax_lookup'),
|
||||
@@ -168,6 +169,18 @@ def facebook_post_likes_allowed(request):
|
||||
|
||||
return HttpResponse(_get_json(False), mimetype="application/json")
|
||||
|
||||
@csrf_exempt
|
||||
def upload_release_image(request, release_id):
|
||||
try:
|
||||
if 'release_image' in request.FILES and release_id is not None:
|
||||
release = Release.objects.get(pk=release_id)
|
||||
if release is not None:
|
||||
release.release_image = request.FILES['release_image']
|
||||
release.save()
|
||||
return HttpResponse(_get_json("Success"))
|
||||
except Exception, ex:
|
||||
logger.exception("Error uploading avatar")
|
||||
return HttpResponse(_get_json("Failed"))
|
||||
|
||||
@csrf_exempt
|
||||
def upload_image(request, mix_id):
|
||||
|
||||
@@ -32,7 +32,7 @@ class ReleaseResource(BackboneCompatibleResource):
|
||||
return bundle
|
||||
|
||||
def dehydrate(self, bundle):
|
||||
bundle.data['label'] = bundle.obj.release_label.name
|
||||
bundle.data['release_label'] = bundle.obj.release_label.name
|
||||
bundle.data['item_url'] = 'release/%s' % bundle.obj.id
|
||||
bundle.data['mode'] = 'release'
|
||||
return bundle
|
||||
|
||||
@@ -83,6 +83,7 @@ var AppRouter = Backbone.Router.extend({
|
||||
release.fetch({success:function () {
|
||||
var content = new ReleaseView({model:release}).el;
|
||||
$('#content').html(content);
|
||||
/*
|
||||
var audio = new ReleaseAudioCollection();
|
||||
audio.url = window.appSettings.urlRoot + release.attributes.item_url + "/release_audio/";
|
||||
audio.audio_id = id;
|
||||
@@ -91,6 +92,7 @@ var AppRouter = Backbone.Router.extend({
|
||||
var content = new ReleaseAudioListView({collection:audio});
|
||||
$('#release-description').html(content.el);
|
||||
}});
|
||||
*/
|
||||
}});
|
||||
},
|
||||
releaseAdd: function(){
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
var Comment = TastypieModel.extend({
|
||||
var Comment = DSSModel.extend({
|
||||
urlRoot:window.appSettings.urlRoot + "comments/"
|
||||
});
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
var Event = TastypieModel.extend({
|
||||
var Event = DSSModel.extend({
|
||||
urlRoot:window.appSettings.urlRoot + "event/"
|
||||
});
|
||||
var EventCollection = TastypieCollection.extend({
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
window.Mix = TastypieModel.extend({
|
||||
window.Mix = DSSModel.extend({
|
||||
urlRoot:window.appSettings.urlRoot + "mix/",
|
||||
schema:{
|
||||
title:'Text',
|
||||
|
||||
@@ -1,5 +1,24 @@
|
||||
var Release = TastypieModel.extend({
|
||||
urlRoot:window.appSettings.urlRoot + "release/"
|
||||
var Release = DSSModel.extend({
|
||||
urlRoot:window.appSettings.urlRoot + "release/",
|
||||
isValid:function () {
|
||||
this.errors = {};
|
||||
if (isEmpty(this.get('release_label'))) {
|
||||
return this.addError('release_label', 'Please choose a label');
|
||||
}
|
||||
if (isEmpty(this.get('release_title'))) {
|
||||
return this.addError('release_title', 'Please choose a title');
|
||||
}
|
||||
if (isEmpty(this.get('release_artist'))) {
|
||||
return this.addError('release_artist', 'Please choose an artist');
|
||||
}
|
||||
if (isEmpty(this.get('release_date'))) {
|
||||
return this.addError('release_date', 'Please choose a valid date');
|
||||
}
|
||||
if (isEmpty(this.get('release_description'))) {
|
||||
return this.addError('release_description', 'Please enter a description of some sort');
|
||||
}
|
||||
return "";
|
||||
}
|
||||
});
|
||||
var ReleaseCollection = TastypieCollection.extend({
|
||||
url:window.appSettings.urlRoot + "release/",
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
var ReleaseAudio = TastypieModel.extend({
|
||||
var ReleaseAudio = DSSModel.extend({
|
||||
urlRoot:window.appSettings.urlRoot + "release_audio/"
|
||||
});
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
var User = TastypieModel.extend({
|
||||
var User = DSSModel.extend({
|
||||
urlRoot:window.appSettings.urlRoot + "user/"
|
||||
});
|
||||
|
||||
@@ -79,24 +79,9 @@ window.utils = {
|
||||
};
|
||||
setHashbangHeader = function (xhr) {
|
||||
xhr.setRequestHeader('X-FB-Nonsense', 'Argle-Bargle');
|
||||
}
|
||||
};
|
||||
|
||||
window.TastypieModel = Backbone.Model.extend({
|
||||
base_url:function () {
|
||||
var temp_url = Backbone.Model.prototype.url.call(this);
|
||||
return (temp_url.charAt(temp_url.length - 1) == '/' ? temp_url : temp_url + '/');
|
||||
},
|
||||
url:function () {
|
||||
return this.base_url();
|
||||
}
|
||||
});
|
||||
|
||||
window.TastypieCollection = Backbone.Collection.extend({
|
||||
parse:function (response) {
|
||||
this.recent_meta = response.meta || {};
|
||||
return response.objects || response;
|
||||
}
|
||||
});
|
||||
jQuery.extend({
|
||||
handleError:function (s, xhr, status, e) {
|
||||
// If a local callback was specified, fire it
|
||||
@@ -113,11 +98,11 @@ jQuery.extend({
|
||||
(function () {
|
||||
var proxied = window.alert;
|
||||
/*
|
||||
window.alert = function () {
|
||||
$('#alert-proxy-message').text(arguments[0]);
|
||||
$('#alert-proxy').modal();
|
||||
};
|
||||
*/
|
||||
window.alert = function () {
|
||||
$('#alert-proxy-message').text(arguments[0]);
|
||||
$('#alert-proxy').modal();
|
||||
};
|
||||
*/
|
||||
})();
|
||||
|
||||
function generateGuid() {
|
||||
@@ -129,10 +114,14 @@ function generateGuid() {
|
||||
function pad2(number) {
|
||||
return (number < 10 ? '0' : '') + number
|
||||
}
|
||||
function getDateAsToday(){
|
||||
function getDateAsToday() {
|
||||
var currentTime = new Date();
|
||||
var day = currentTime.getDate();
|
||||
var month = currentTime.getMonth() + 1;
|
||||
var year = currentTime.getFullYear();
|
||||
return (pad2(day) + "/" + pad2(month) + "/" + year);
|
||||
}
|
||||
|
||||
function isEmpty(val){
|
||||
return (val === undefined || val == null || val.length <= 0) ? true : false;
|
||||
}
|
||||
@@ -72,7 +72,6 @@ var ReleaseCreateView = Backbone.View.extend({
|
||||
$(this.el).html(this.template({"item":this.model.toJSON()}));
|
||||
var el = this.el;
|
||||
var model = this.model;
|
||||
console.clear();
|
||||
var labels, mapped;
|
||||
$('.typeahead', this.el).typeahead({
|
||||
source:function (query, process) {
|
||||
@@ -89,7 +88,7 @@ var ReleaseCreateView = Backbone.View.extend({
|
||||
process(labels);
|
||||
}, 'json');
|
||||
},
|
||||
updater: function(item){
|
||||
updater:function (item) {
|
||||
$('#release_label_id', el).val(mapped[item].pk);
|
||||
model.set('release_label_id', mapped[item].pk);
|
||||
return item;
|
||||
@@ -97,11 +96,11 @@ var ReleaseCreateView = Backbone.View.extend({
|
||||
});
|
||||
$('.datepicker', this.el).datepicker(
|
||||
{
|
||||
'format' : 'dd/mm/yyyy'
|
||||
'format':'dd/mm/yyyy'
|
||||
}
|
||||
);
|
||||
$('textarea.tinymce', this.el).tinymce({
|
||||
script_url: "/static/js/libs/tiny_mce/tiny_mce.js",
|
||||
script_url:"/static/js/libs/tiny_mce/tiny_mce.js",
|
||||
mode:"textareas",
|
||||
theme:"advanced",
|
||||
theme_advanced_toolbar_location:"top",
|
||||
@@ -126,18 +125,47 @@ var ReleaseCreateView = Backbone.View.extend({
|
||||
var model = this.model;
|
||||
var el = this.el;
|
||||
var parent = this;
|
||||
|
||||
this.model.set('release_description', $('#release-description', this.el).html());
|
||||
this.model.set('release_date', $('#release-date', this.el).val());
|
||||
this.model.save(
|
||||
null, {
|
||||
success:function () {
|
||||
window.utils.showAlert("Success", "Release succesfully added", "alert-info", true);
|
||||
app.navigate('#/release/' + model.get('id'));
|
||||
},
|
||||
error:function () {
|
||||
alert("Error saving release");
|
||||
this.model.set('release_date', $('#release_date', this.el).val());
|
||||
this.model.set('embed_code', $('#embed_code', this.el).val());
|
||||
if (this.model.isValid() != "") {
|
||||
if (this.model.errors){
|
||||
for (var error in this.model.errors){
|
||||
$('#group-' + error, this.el).addClass('error');
|
||||
$('#error-' + error, this.el).text(this.model.errors[error]);
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
this.model.save(
|
||||
null, {
|
||||
success:function () {
|
||||
$.ajaxFileUpload({
|
||||
url:'ajax/upload_release_image/' + model.get('id') + '/',
|
||||
secureuri:false,
|
||||
fileElementId:'release_image',
|
||||
success:function (data, status) {
|
||||
if (typeof(data.error) != 'undefined') {
|
||||
if (data.error != '') {
|
||||
alert(data.error);
|
||||
} else {
|
||||
alert(data.msg);
|
||||
}
|
||||
} else {
|
||||
window.utils.showAlert("Success", "Release successfully added", "alert-info", true);
|
||||
app.navigate('#/release/' + model.get('id'));
|
||||
}
|
||||
},
|
||||
error:function (data, status, e) {
|
||||
alert(e);
|
||||
}
|
||||
});
|
||||
},
|
||||
error:function () {
|
||||
alert("Error saving release");
|
||||
}
|
||||
});
|
||||
}
|
||||
return false;
|
||||
},
|
||||
changed:function (evt) {
|
||||
|
||||
57
static/js/libs/backbone/backbone.mine.js
Executable file
57
static/js/libs/backbone/backbone.mine.js
Executable file
@@ -0,0 +1,57 @@
|
||||
Backbone.Validate = function(model, changedAttributes) {
|
||||
|
||||
return (function() {
|
||||
this.errors = {};
|
||||
this.attributes = _.clone(model.attributes);
|
||||
_.extend(this.attributes, changedAttributes);
|
||||
_.each(model.validates, function(value, rule) {
|
||||
this.validators[rule](value);
|
||||
});
|
||||
|
||||
this.validators = {
|
||||
required: function(fields) {
|
||||
_.each(fields, function(field) {
|
||||
if(_.isEmpty(this.attributes[field]) === true) {
|
||||
this.addError(field, I18n.t('errors.form.required'));
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
this.addError = function(field, message) {
|
||||
if (_.isUndefined(this.errors[field])) {
|
||||
this.errors[field] = [];
|
||||
}
|
||||
this.errors[field].push(message);
|
||||
};
|
||||
|
||||
return this.errors;
|
||||
})();
|
||||
};
|
||||
|
||||
window.TastypieModel = Backbone.Model.extend({
|
||||
base_url:function () {
|
||||
var temp_url = Backbone.Model.prototype.url.call(this);
|
||||
return (temp_url.charAt(temp_url.length - 1) == '/' ? temp_url : temp_url + '/');
|
||||
},
|
||||
url:function () {
|
||||
return this.base_url();
|
||||
}
|
||||
});
|
||||
|
||||
window.TastypieCollection = Backbone.Collection.extend({
|
||||
parse:function (response) {
|
||||
this.recent_meta = response.meta || {};
|
||||
return response.objects || response;
|
||||
}
|
||||
});
|
||||
|
||||
window.DSSModel = window.TastypieModel.extend({
|
||||
addError: function(field, message) {
|
||||
if (_.isUndefined(this.errors[field])) {
|
||||
this.errors[field] = [];
|
||||
}
|
||||
this.errors[field].push(message);
|
||||
return field;
|
||||
}
|
||||
});
|
||||
@@ -85,6 +85,7 @@
|
||||
<script src="{{ STATIC_URL }}js/libs/backbone/underscore.js"></script>
|
||||
<script src="{{ STATIC_URL }}js/libs/ICanHaz.js"></script>
|
||||
<script src="{{ STATIC_URL }}js/libs/backbone/backbone.js"></script>
|
||||
<script src="{{ STATIC_URL }}js/libs/backbone/backbone.mine.js"></script>
|
||||
<script src="{{ STATIC_URL }}js/libs/jquery.colorbox.js"></script>
|
||||
<!-- backbone application -->
|
||||
<script src="{{ STATIC_URL }}js/libs/backbone/backbone-tastypie.js"></script>
|
||||
|
||||
@@ -3,36 +3,79 @@
|
||||
{% csrf_token %}
|
||||
<legend>Release details</legend>
|
||||
<div class="row">
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label">Label</label>
|
||||
<div class="controls">
|
||||
<input id="release_label" class="typeahead" autocomplete="off" type="text" data-provide="typeahead">
|
||||
<input type="hidden" id="release_label_id">
|
||||
<div class="span6">
|
||||
<div class="control-group" id="group-release_label">
|
||||
<label class="control-label">Label</label>
|
||||
<div class="controls">
|
||||
<input id="release_label" class="typeahead" autocomplete="off" type="text"
|
||||
data-provide="typeahead">
|
||||
<span class="help-inline" id="error-release_label"></span>
|
||||
<input type="hidden" id="release_label_id">
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group" id="group-release_artist">
|
||||
<label class="control-label">Artist</label>
|
||||
<div class="controls">
|
||||
<input id="release_artist" type="text" placeholder="Who dunnit…">
|
||||
<span class="help-inline" id="error-release_artist"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">Artist</label>
|
||||
<div class="controls">
|
||||
<input id="release_artist" type="text" placeholder="Who dunnit…">
|
||||
<div class="span6">
|
||||
<div class="control-group" id="group-release_title">
|
||||
<label class="control-label">Title</label>
|
||||
<div class="controls">
|
||||
<input id="release_title" type="text" placeholder="What they dun…">
|
||||
<span class="help-inline" id="error-release_title"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group" id="group-release_date">
|
||||
<label class="control-label">Release date</label>
|
||||
<div class="controls">
|
||||
<input id="release_date" class="datepicker" type="text" value="<%= item.release_date %>">
|
||||
<span class="help-inline" id="error-release_date"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">Title</label>
|
||||
<div class="controls">
|
||||
<input id="release_title" type="text" placeholder="What they dun…">
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">Release date</label>
|
||||
<div class="controls">
|
||||
<input id="release_date" class="datepicker" type="text" value="<%= item.release_date %>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="control-group" id="group-release_description">
|
||||
<label class="control-label">Description</label>
|
||||
<div class="controls">
|
||||
<textarea style="width:100%" class="tinymce" id="release-description" rows="10"/>
|
||||
<span class="help-inline" id="error-release_description"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="span6">
|
||||
<div class="control-group">
|
||||
<label class="control-label">Embed Code</label>
|
||||
<div class="controls">
|
||||
<textarea style="width:100%" id="embed_code" rows="10"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="span6">
|
||||
<div class="fileupload fileupload-new" data-provides="fileupload">
|
||||
<div class="fileupload-new thumbnail" style="width: 200px; height: 150px;">
|
||||
<img src="http://www.placehold.it/200x150/EFEFEF/AAAAAA&text=no+image"/>
|
||||
</div>
|
||||
<div class="fileupload-preview fileupload-exists thumbnail"
|
||||
style="max-width: 200px; max-height: 150px; line-height: 20px;">
|
||||
</div>
|
||||
<div>
|
||||
<span class="btn btn-file">
|
||||
<span class="fileupload-new">
|
||||
Select image
|
||||
</span>
|
||||
<span class="fileupload-exists">
|
||||
Change
|
||||
</span>
|
||||
<input id="release_image" type="file" size="45" name="release_image" class="input">
|
||||
</span>
|
||||
<a href="#" class="btn fileupload-exists" data-dismiss="fileupload">Remove</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user