server/python/django/renkanmanager/utils.py
author durandn
Thu, 21 Apr 2016 15:18:19 +0200
changeset 605 13d355fd09bf
parent 367 9a3d5fdbf296
permissions -rw-r--r--
updated uri to allow optional trailing slash on single resource URIs (django automatic redirects don't carry over the Authorization header that can sometimes be needed, for instance with OAuth)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
318
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
     1
# -*- coding: utf-8 -*-
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
     2
'''
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
     3
Created on Mar 13, 2012
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
     4
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
     5
@author: ymh and tc
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
     6
'''
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
     7
from django.core.cache import cache
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
     8
from django.core.exceptions import ValidationError
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
     9
from django.http.response import Http404
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    10
from django.shortcuts import get_object_or_404
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    11
from django.utils.encoding import smart_str
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    12
from renkanmanager.models import Renkan
324
a4a575e755aa circle node placer
cavaliet
parents: 323
diff changeset
    13
import math
334
de35ce18643a add setup for renkanmanager.
ymh <ymh.work@gmail.com>
parents: 333
diff changeset
    14
import hashlib
318
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    15
import re
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    16
import uuid
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    17
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    18
import logging
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    19
logger = logging.getLogger(__name__)
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    20
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    21
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    22
def fix_cache_key(key):
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    23
    cache_key = re.sub(r'\s+', '-', key)
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    24
    cache_key = smart_str(cache_key)
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    25
    if len(cache_key) > (250-(2+len(cache.key_prefix)+len(str(cache.version)))-33):
334
de35ce18643a add setup for renkanmanager.
ymh <ymh.work@gmail.com>
parents: 333
diff changeset
    26
        cache_key = cache_key[:(250-(2+len(cache.key_prefix)+len(str(cache.version)))-33)] + '-' + hashlib.md5(cache_key).hexdigest()
318
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    27
    return cache_key
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    28
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    29
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    30
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    31
class NodePlacer():
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    32
    
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    33
    cat_nb_nodes = {}
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    34
    
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    35
    def init(self, cat_nb_nodes_initial):
323
d5e2007c01d8 better x values for line placer
cavaliet
parents: 318
diff changeset
    36
        raise NotImplementedError( "Should have implemented init" )
318
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    37
    
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    38
    def get_place(self, category):
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    39
        if not category or category not in self.cat_nb_nodes:
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    40
            raise Http404
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    41
        return self.cat_nb_nodes[category].pop(0)
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    42
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    43
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    44
366
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    45
class LineNodePlacer(NodePlacer): #vertical lines
318
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    46
    
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    47
    max_length = 0
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    48
    
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    49
    def init(self, cat_nb_nodes_initial):
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    50
        for c in cat_nb_nodes_initial:
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    51
            nb = cat_nb_nodes_initial[c]
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    52
            if isinstance(cat_nb_nodes_initial[c], tuple):
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    53
                _, nb = nb
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    54
            self.max_length = nb if nb > self.max_length else self.max_length
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    55
        for i_cat,c in enumerate(cat_nb_nodes_initial):
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    56
            self.cat_nb_nodes[c] = []
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    57
            order = i_cat
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    58
            nb = cat_nb_nodes_initial[c]
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    59
            if isinstance(cat_nb_nodes_initial[c], tuple):
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    60
                order, nb = nb
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    61
            offset = float(self.max_length - nb) / 2
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    62
            for i in xrange(nb):
333
935cffdf3904 northwest node in placers
cavaliet
parents: 324
diff changeset
    63
                if c=="northwest":
935cffdf3904 northwest node in placers
cavaliet
parents: 324
diff changeset
    64
                    self.cat_nb_nodes[c].append({ "x": order*500, "y": offset })
935cffdf3904 northwest node in placers
cavaliet
parents: 324
diff changeset
    65
                else:
935cffdf3904 northwest node in placers
cavaliet
parents: 324
diff changeset
    66
                    self.cat_nb_nodes[c].append({ "x": order*500, "y": 100*(i+offset) })
318
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    67
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    68
366
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    69
class HorLineNodePlacer(NodePlacer): #horizontal lines
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    70
    
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    71
    max_length = 0
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    72
    
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    73
    def init(self, cat_nb_nodes_initial):
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    74
        for c in cat_nb_nodes_initial:
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    75
            nb = cat_nb_nodes_initial[c]
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    76
            if isinstance(cat_nb_nodes_initial[c], tuple):
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    77
                _, nb = nb
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    78
            self.max_length = nb if nb > self.max_length else self.max_length
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    79
        for i_cat,c in enumerate(cat_nb_nodes_initial):
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    80
            self.cat_nb_nodes[c] = []
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    81
            order = i_cat
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    82
            nb = cat_nb_nodes_initial[c]
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    83
            if isinstance(cat_nb_nodes_initial[c], tuple):
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    84
                order, nb = nb
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    85
            offset = float(self.max_length - nb) / 2
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    86
            for i in xrange(nb):
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    87
                if c=="northwest":
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    88
                    self.cat_nb_nodes[c].append({ "x": offset, "y": order*500 })
e8327b4e8b8b add horizontal line representation
rougeronj
parents: 334
diff changeset
    89
                else:
367
9a3d5fdbf296 Update horizontal representation : place the node in staggered row for better visibility
rougeronj
parents: 366
diff changeset
    90
                    if (i%2) == 0:
9a3d5fdbf296 Update horizontal representation : place the node in staggered row for better visibility
rougeronj
parents: 366
diff changeset
    91
                        self.cat_nb_nodes[c].append({ "x": 100*(i+offset), "y": order*500 })
9a3d5fdbf296 Update horizontal representation : place the node in staggered row for better visibility
rougeronj
parents: 366
diff changeset
    92
                    else:
9a3d5fdbf296 Update horizontal representation : place the node in staggered row for better visibility
rougeronj
parents: 366
diff changeset
    93
                        self.cat_nb_nodes[c].append({ "x": 100*(i+offset), "y": order*450 })
318
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    94
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    95
class CircleNodePlacer(NodePlacer):
324
a4a575e755aa circle node placer
cavaliet
parents: 323
diff changeset
    96
    
318
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    97
    def init(self, cat_nb_nodes_initial):
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    98
        for i_cat,c in enumerate(cat_nb_nodes_initial):
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
    99
            self.cat_nb_nodes[c] = []
324
a4a575e755aa circle node placer
cavaliet
parents: 323
diff changeset
   100
            order = i_cat
a4a575e755aa circle node placer
cavaliet
parents: 323
diff changeset
   101
            nb = cat_nb_nodes_initial[c]
a4a575e755aa circle node placer
cavaliet
parents: 323
diff changeset
   102
            if isinstance(cat_nb_nodes_initial[c], tuple):
a4a575e755aa circle node placer
cavaliet
parents: 323
diff changeset
   103
                order, nb = nb
a4a575e755aa circle node placer
cavaliet
parents: 323
diff changeset
   104
            order -= 1
a4a575e755aa circle node placer
cavaliet
parents: 323
diff changeset
   105
            for i in xrange(nb):
a4a575e755aa circle node placer
cavaliet
parents: 323
diff changeset
   106
                radius = (order*500) if order>0 else 100
a4a575e755aa circle node placer
cavaliet
parents: 323
diff changeset
   107
                angle = 2 * math.pi * i / nb
333
935cffdf3904 northwest node in placers
cavaliet
parents: 324
diff changeset
   108
                if c=="northwest":
935cffdf3904 northwest node in placers
cavaliet
parents: 324
diff changeset
   109
                    self.cat_nb_nodes[c].append({ "x": -radius, "y": -radius })
935cffdf3904 northwest node in placers
cavaliet
parents: 324
diff changeset
   110
                else:
935cffdf3904 northwest node in placers
cavaliet
parents: 324
diff changeset
   111
                    self.cat_nb_nodes[c].append({ "x": radius*math.cos(angle), "y": radius*math.sin(angle) })
318
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   112
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   113
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   114
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   115
def renkan_copier(user, old_rk_id):
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   116
    old_rk = get_object_or_404(Renkan, rk_id=old_rk_id)
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   117
    rk = Renkan()
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   118
    rk.rk_id = unicode(uuid.uuid1())
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   119
    rk.owner = user
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   120
    rk.content = old_rk.content
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   121
    #TODO : update title and uuid in the content's json data
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   122
    rk.title = old_rk.title + " (copy)"
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   123
    rk.save()
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   124
    return rk
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   125
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   126
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   127
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   128
def renkan_deleter(user, rk_id):
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   129
    rk = get_object_or_404(Renkan, rk_id=rk_id)
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   130
    if rk.owner==user:
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   131
        rk.delete()
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   132
    else:
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   133
        raise ValidationError("You are not allowed to remove this renkan")
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   134
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   135
815589aed866 django app renkamanager (models, vanilla views, utils, static files)
cavaliet
parents:
diff changeset
   136