Port to new django version - not yet fully working

- location field makes problems
This commit is contained in:
Martin Bauer
2019-01-05 11:27:15 +01:00
parent 72a9642a8e
commit 663185fd40
168 changed files with 797 additions and 5967 deletions

View File

@@ -12,61 +12,60 @@ from django.utils.safestring import mark_safe
def space_to_camelcase(value):
def camelcase():
def camelcase():
yield type(value).lower
while True:
yield type(value).capitalize
c = camelcase()
return "".join(c.next()(x) if x else '_' for x in value.split() )
return "".join(c.next()(x) if x else '_' for x in value.split())
def score_filename(score,original_name):
def score_filename(score, original_name):
fileExtension = os.path.splitext(original_name)[1]
filename = "scores/"
filename += space_to_camelcase( score.piece.title ) + "/"
filename += space_to_camelcase( score.score_type )
filename = "scores/"
filename += space_to_camelcase(score.piece.title) + "/"
filename += space_to_camelcase(score.score_type)
filename += fileExtension
return filename
def recordingFileName( recording, originalName ):
def recordingFileName(recording, originalName):
fileExtension = os.path.splitext(originalName)[1]
filename = "recordings/"
filename += space_to_camelcase( recording.piece.title ) + "/"
filename += space_to_camelcase( recording.artist )
filename = "recordings/"
filename += space_to_camelcase(recording.piece.title) + "/"
filename += space_to_camelcase(recording.artist)
filename += fileExtension
return filename
_
#######################################################################################################
class Piece (models.Model):
title = models.CharField( max_length = 255, verbose_name = _("title"), unique=True )
composer = models.CharField( max_length = 255, blank = True, verbose_name = _("composer") )
repertoire_nr = models.IntegerField( null = True, blank=True, unique=True, default = None )
class Piece(models.Model):
title = models.CharField(max_length=255, verbose_name=_("title"), unique=True)
composer = models.CharField(max_length=255, blank=True, verbose_name=_("composer"))
repertoire_nr = models.IntegerField(null=True, blank=True, unique=True, default=None)
def __unicode__(self):
res = self.title
return res
return res
def isInRepertoire(self):
return self.repertoire_nr is not None
def get_score_for_user(self, user):
try:
return ScoreUserMapping.objects.get( user=user, score__in = self.scores.all() ).score
return ScoreUserMapping.objects.get(user=user, score__in=self.scores.all()).score
except Piece.DoesNotExist:
if len( self.scores.all() ) > 0:
if len(self.scores.all()) > 0:
return self.scores.all()[0]
else:
return None
@staticmethod
def getRepertoire():
return Piece.objects.filter( repertoire_nr__isnull = False ).order_by( 'repertoire_nr' )
return Piece.objects.filter(repertoire_nr__isnull=False).order_by('repertoire_nr')
class Meta:
permissions = (
@@ -74,36 +73,34 @@ class Piece (models.Model):
)
class BookLocation(models.Model):
piece = models.ForeignKey('Piece', on_delete=models.PROTECT)
book = models.CharField(max_length=100, blank=False, verbose_name=_("Buch"))
page = models.IntegerField(verbose_name=_("page"))
class BookLocation ( models.Model ):
piece = models.ForeignKey ( 'Piece' )
book = models.CharField( max_length = 100, blank = False, verbose_name = _("Buch") )
page = models.IntegerField( verbose_name = _("page") )
def __unicode__(self):
return "%s, %d" % ( self.book, self.page )
return "%s, %d" % (self.book, self.page)
class Score( models.Model ):
piece = ForeignKey('Piece', related_name="scores")
score_type = models.CharField(max_length=100, verbose_name="score type" ) # for example partitur, unterstimmen ...
file = models.FileField(upload_to=score_filename, verbose_name = _("file") )
uploaded_by = ForeignKey( User, verbose_name=_("uploaded_by") )
class Score(models.Model):
piece = ForeignKey('Piece', related_name="scores", on_delete=models.PROTECT)
score_type = models.CharField(max_length=100, verbose_name="score type") # for example partitur, unterstimmen ...
file = models.FileField(upload_to=score_filename, verbose_name=_("file"))
uploaded_by = ForeignKey(User, verbose_name=_("uploaded_by"), on_delete=models.PROTECT)
@property
def image_file_name(self):
return os.path.splitext("image_cache/" + str(self.file))[0] + ".jpg"
@staticmethod
def pdf2jpg(source_file, target_file, resolution = 100, crop = 15):
def pdf2jpg(source_file, target_file, resolution=100, crop=15):
from wand.image import Image
ret = True
try:
with Image(filename=source_file, resolution=(resolution,resolution)) as img:
img.crop( crop,crop, width= img.width - 2*crop, height = int( 0.5 * img.height) - 2*crop )
with Image(filename=source_file, resolution=(resolution, resolution)) as img:
img.crop(crop, crop, width=img.width - 2 * crop, height=int(0.5 * img.height) - 2 * crop)
img.format = 'jpeg'
img.save(filename = target_file)
img.save(filename=target_file)
except Exception as e:
print(e)
ret = False
@@ -113,71 +110,63 @@ class Score( models.Model ):
def get_image_file(self):
from django.conf import settings
inputFile = settings.MEDIA_ROOT + "/" + str(self.file)
inputFile = settings.MEDIA_ROOT + "/" + str(self.file)
cacheFile = settings.MEDIA_ROOT + "/" + str(self.image_file_name)
# Create a jpg for this score, if it does not exist yet
if not os.path.exists( cacheFile ):
if not os.path.exists( os.path.dirname( cacheFile )):
os.makedirs( os.path.dirname(cacheFile) )
Score.pdf2jpg ( inputFile, cacheFile )
if not os.path.exists(cacheFile):
if not os.path.exists(os.path.dirname(cacheFile)):
os.makedirs(os.path.dirname(cacheFile))
Score.pdf2jpg(inputFile, cacheFile)
return self.image_file_name
def is_active_score(self,user):
return len( ScoreUserMapping.objects.filter( score= self, user=user ) ) > 0
def is_active_score(self, user):
return len(ScoreUserMapping.objects.filter(score=self, user=user)) > 0
class Meta:
unique_together = (("piece", "score_type"),)
ordering = ['score_type']
class Recording( models.Model ):
piece = ForeignKey( 'Piece', related_name='recordings' )
artist = models.CharField( max_length = 100, verbose_name = _("Artist") )
file = models.FileField( upload_to = recordingFileName, verbose_name = _("file") )
uploaded_by = ForeignKey( User, verbose_name=_("uploaded_by") )
class Recording(models.Model):
piece = ForeignKey('Piece', related_name='recordings', on_delete=models.PROTECT)
artist = models.CharField(max_length=100, verbose_name=_("Artist"))
file = models.FileField(upload_to=recordingFileName, verbose_name=_("file"))
uploaded_by = ForeignKey(User, verbose_name=_("uploaded_by"), on_delete=models.PROTECT)
class Meta:
unique_together = (("piece", "artist"),)
ordering = ['artist']
class YoutubeRecording( models.Model ):
piece = models.ForeignKey('Piece', related_name="youtubeLinks" )
link = models.CharField( max_length = 300, blank=False)
uploaded_by = ForeignKey( User, verbose_name=_("uploaded_by") )
class YoutubeRecording(models.Model):
piece = models.ForeignKey('Piece', related_name="youtubeLinks", on_delete=models.PROTECT)
link = models.CharField(max_length=300, blank=False)
uploaded_by = ForeignKey(User, verbose_name=_("uploaded_by"), on_delete=models.PROTECT)
youtubeRegex = re.compile( u'(?:https://)?(?:http://)?www.youtube.(?:com|de)/watch\?v=(?P<videoID>[-\w]*)' )
youtubeRegex = re.compile(u'(?:https://)?(?:http://)?www.youtube.(?:com|de)/watch\?v=(?P<videoID>[-\w]*)')
@property
def embed_html( self ):
def embed_html(self):
replacement = """
<div class="embed-container"><iframe src="//www.youtube.de/embed/\g<videoID>" frameborder="0" allowfullscreen></iframe> </div>
"""
return mark_safe( YoutubeRecording.youtubeRegex.sub( replacement, self.link ) )
return mark_safe(YoutubeRecording.youtubeRegex.sub(replacement, self.link))
class Meta:
unique_together = (("link", "piece" ))
unique_together = ("link", "piece")
class ScoreUserMapping( models.Model):
score = ForeignKey( 'Score' )
user = models.OneToOneField( User )
piece = ForeignKey( 'Piece' )
class ScoreUserMapping(models.Model):
score = ForeignKey('Score', on_delete=models.PROTECT)
user = models.OneToOneField(User, on_delete=models.PROTECT)
piece = ForeignKey('Piece', on_delete=models.PROTECT)
@staticmethod
def add_user_score_mapping( score, user ):
def add_user_score_mapping(score, user):
piece = score.piece
ScoreUserMapping.objects.filter( user=user, piece=piece ).delete()
ScoreUserMapping.objects.create( score=score, user=user, piece= piece )
ScoreUserMapping.objects.filter(user=user, piece=piece).delete()
ScoreUserMapping.objects.create(score=score, user=user, piece=piece)
class Meta:
unique_together = (("piece", "user" ))
unique_together = ("piece", "user")

View File

@@ -1,17 +1,16 @@
from django.conf.urls import patterns, url
from django.conf.urls import url
import scoremanager.views
import scoremanager.pdf_views
urlpatterns = patterns('',
url(r'^repertoireManager$', scoremanager.views.manage_repertoire ),
url(r'^repertoireAjaxSave$$', scoremanager.views.manage_repertoire_ajax_save ),
url(r'^$', scoremanager.views.list_repertoire ),
url(r'^piece/(?P<pk>\d+)', scoremanager.views.piece_view ),
url(r'^score_usermapping_save', scoremanager.views.score_user_mapping_save ),
url(r'^score/(?P<pk>\d+)', scoremanager.views.score ),
url(r'^youtubeLink$', scoremanager.views.youtube_link ),
url(r'^inhaltsverzeichnis.pdf$',scoremanager.pdf_views.repertoire_toc),
url(r'^repertoire.pdf', scoremanager.pdf_views.repertoire_pdf ),
)
urlpatterns = [
url(r'^repertoireManager$', scoremanager.views.manage_repertoire),
url(r'^repertoireAjaxSave$$', scoremanager.views.manage_repertoire_ajax_save),
url(r'^$', scoremanager.views.list_repertoire),
url(r'^piece/(?P<pk>\d+)', scoremanager.views.piece_view),
url(r'^score_usermapping_save', scoremanager.views.score_user_mapping_save),
url(r'^score/(?P<pk>\d+)', scoremanager.views.score),
url(r'^youtubeLink$', scoremanager.views.youtube_link),
url(r'^inhaltsverzeichnis.pdf$', scoremanager.pdf_views.repertoire_toc),
url(r'^repertoire.pdf', scoremanager.pdf_views.repertoire_pdf),
]

View File

@@ -66,7 +66,7 @@ def score( request, pk ):
if request.method == 'GET':
imageFile = requestedScore.get_image_file()
image_data = open( settings.MEDIA_ROOT + imageFile, "rb").read()
return HttpResponse(image_data, mimetype="image/jpeg")
return HttpResponse(image_data, content_type="image/jpeg")
if request.method == "DELETE":
if requestedScore.uploaded_by != request.user or request.user.has_perm('scoremanager.manage_scores'):
raise PermissionDenied