| author | rougeronj |
| Mon, 05 Jan 2015 17:36:33 +0100 | |
| changeset 367 | 9a3d5fdbf296 |
| parent 366 | e8327b4e8b8b |
| permissions | -rw-r--r-- |
|
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 | 13 |
import math |
| 334 | 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 | 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 | 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 | 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 | 63 |
if c=="northwest": |
64 |
self.cat_nb_nodes[c].append({ "x": order*500, "y": offset }) |
|
65 |
else: |
|
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 | 69 |
class HorLineNodePlacer(NodePlacer): #horizontal lines |
70 |
||
71 |
max_length = 0 |
|
72 |
||
73 |
def init(self, cat_nb_nodes_initial): |
|
74 |
for c in cat_nb_nodes_initial: |
|
75 |
nb = cat_nb_nodes_initial[c] |
|
76 |
if isinstance(cat_nb_nodes_initial[c], tuple): |
|
77 |
_, nb = nb |
|
78 |
self.max_length = nb if nb > self.max_length else self.max_length |
|
79 |
for i_cat,c in enumerate(cat_nb_nodes_initial): |
|
80 |
self.cat_nb_nodes[c] = [] |
|
81 |
order = i_cat |
|
82 |
nb = cat_nb_nodes_initial[c] |
|
83 |
if isinstance(cat_nb_nodes_initial[c], tuple): |
|
84 |
order, nb = nb |
|
85 |
offset = float(self.max_length - nb) / 2 |
|
86 |
for i in xrange(nb): |
|
87 |
if c=="northwest": |
|
88 |
self.cat_nb_nodes[c].append({ "x": offset, "y": order*500 }) |
|
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 | 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 | 100 |
order = i_cat |
101 |
nb = cat_nb_nodes_initial[c] |
|
102 |
if isinstance(cat_nb_nodes_initial[c], tuple): |
|
103 |
order, nb = nb |
|
104 |
order -= 1 |
|
105 |
for i in xrange(nb): |
|
106 |
radius = (order*500) if order>0 else 100 |
|
107 |
angle = 2 * math.pi * i / nb |
|
| 333 | 108 |
if c=="northwest": |
109 |
self.cat_nb_nodes[c].append({ "x": -radius, "y": -radius }) |
|
110 |
else: |
|
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 |