server/python/django/renkanmanager/utils.py
author ymh <ymh.work@gmail.com>
Wed, 13 Sep 2017 18:31:15 +0200
changeset 655 8917ba481609
parent 367 9a3d5fdbf296
permissions -rw-r--r--
define new version 0.13.01
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