~widelands-dev/widelands-website/trunk

120 by Holger Rapp
Initital (unusable) version of wlmaps application
1
#!/usr/bin/env python -tt
2
# encoding: utf-8
3
4
from django.db import models
5
from django.contrib.auth.models import User
6
from django.template.defaultfilters import slugify
489.1.16 by franku
run through django1.111 deprecations
7
from django.urls import reverse
542.2.2 by franku
added signal receiver for deletion of map files
8
from django.db.models.signals import pre_delete
542.2.7 by kaputtnik
use a custom delete function instead of signals
9
from django.conf import settings
542.2.1 by franku
move minimap files
10
120 by Holger Rapp
Initital (unusable) version of wlmaps application
11
import datetime
542.2.7 by kaputtnik
use a custom delete function instead of signals
12
import os
450.1.14 by franku
trys: excepts: ; some comments
13
try:
14
    from notification import models as notification
15
except ImportError:
16
    notification = None
120 by Holger Rapp
Initital (unusable) version of wlmaps application
17
18
19
class Map(models.Model):
402.1.2 by franku
add_hint_to_map_views
20
    name = models.CharField(max_length=255, unique=True)
120 by Holger Rapp
Initital (unusable) version of wlmaps application
21
    slug = models.SlugField(unique=True)
402.1.2 by franku
add_hint_to_map_views
22
    author = models.CharField(max_length=255)
23
    w = models.PositiveIntegerField(verbose_name='Width')
24
    h = models.PositiveIntegerField(verbose_name='Height')
25
    nr_players = models.PositiveIntegerField(verbose_name='Max Players')
26
27
    descr = models.TextField(verbose_name='Description')
482.1.1 by franku
changed admin site and allow blank model fields
28
    hint = models.TextField(verbose_name='Hint', blank=True)
402.1.2 by franku
add_hint_to_map_views
29
    minimap = models.ImageField(
418.1.2 by franku
correct wrong migration for wlmaps
30
        verbose_name='Minimap', upload_to='wlmaps/minimaps')
402.1.2 by franku
add_hint_to_map_views
31
    file = models.FileField(verbose_name='Mapfile',
418.1.2 by franku
correct wrong migration for wlmaps
32
                            upload_to='wlmaps/maps')
402.1.2 by franku
add_hint_to_map_views
33
482.1.1 by franku
changed admin site and allow blank model fields
34
    world_name = models.CharField(max_length=50, blank=True)
402.1.2 by franku
add_hint_to_map_views
35
36
    pub_date = models.DateTimeField(default=datetime.datetime.now)
37
    uploader_comment = models.TextField(
38
        verbose_name='Uploader comment', blank=True)
120 by Holger Rapp
Initital (unusable) version of wlmaps application
39
    uploader = models.ForeignKey(User)
402.1.2 by franku
add_hint_to_map_views
40
    nr_downloads = models.PositiveIntegerField(
41
        verbose_name='Download count', default=0)
542.2.5 by franku
implemented new property need_widelands_version_after
42
    wl_version_after = models.PositiveIntegerField(
43
        verbose_name='WL version after',
542.2.7 by kaputtnik
use a custom delete function instead of signals
44
        null=True,
45
        blank=True)
157 by Holger Rapp
Backend for map voting is completed. 'Only' the UI is missing
46
121 by Holger Rapp
Wlmaps application is now in a usuable state
47
    class Meta:
370.1.4 by Matthias Horne
Small cleanups
48
        ordering = ('-pub_date',)
121 by Holger Rapp
Wlmaps application is now in a usuable state
49
        get_latest_by = 'pub_date'
173.2.2 by Holger Rapp
Added diff_match_patch from google, because they do not provide a setup.py
50
402.1.2 by franku
add_hint_to_map_views
51
    def get_absolute_url(self):
489.1.16 by franku
run through django1.111 deprecations
52
        return reverse('wlmaps_view', kwargs={'map_slug': self.slug})
120 by Holger Rapp
Initital (unusable) version of wlmaps application
53
532.1.2 by franku
replaced renamed functions and __unicode__ with __str__
54
    def __str__(self):
532.1.1 by franku
converted to python 3.6 using 2to3 script
55
        return '%s by %s' % (self.name, self.author)
325.1.9 by Shevonar
Maps modul reworked and adjusted to new style.
56
57
    def save(self, *args, **kwargs):
58
        if not self.slug:
59
            self.slug = slugify(self.name)
60
461 by franku
added a query to examine a new map to prevend sending emails for map voting; also corrected a 404 on map vote
61
        # Check if this is a new map for sending notifications
62
        is_new = False
63
        try:
64
            Map.objects.get(slug=self.slug)
65
        except Map.DoesNotExist:
66
            is_new = True
67
325.1.9 by Shevonar
Maps modul reworked and adjusted to new style.
68
        map = super(Map, self).save(*args, **kwargs)
459 by franku
Send notifications only if the map is newly saved, not when updating some fields, e.g. nr_downloads
69
478.2.11 by franku
unified notice for new topics; maps: exclude uploader from notifications
70
        # Send notifications only on new maps, not when updating fields, e.g.
71
        # nr_downloads
461 by franku
added a query to examine a new map to prevend sending emails for map voting; also corrected a 404 on map vote
72
        if notification and is_new:
478.2.18 by franku
fixed a failure in wlmaps
73
            notification.send(notification.get_observers_for('maps_new_map', excl_user=self.uploader), 'maps_new_map',
478.2.11 by franku
unified notice for new topics; maps: exclude uploader from notifications
74
                              {'mapname': self.name,
75
                               'url': self.get_absolute_url(),
76
                               'user': self.uploader,
77
                               'uploader_comment': self.uploader_comment
78
                               },
520.1.1 by franku
add global constant NOTIFICATION_QUEUE_ALL
79
                              )
450.1.14 by franku
trys: excepts: ; some comments
80
478.2.11 by franku
unified notice for new topics; maps: exclude uploader from notifications
81
        return map
542.2.2 by franku
added signal receiver for deletion of map files
82
542.2.7 by kaputtnik
use a custom delete function instead of signals
83
    def delete(self, *args, **kwargs):
84
        """Delete also corresponding map files."""
85
86
        # For some reason this throws no error if a file didn't exist
87
        self.minimap.delete()
88
        self.file.delete()
89
        super(Map, self).delete(*args, **kwargs)