Gustavo Picon is sharing code with you

Bitbucket is a code hosting site. Unlimited public and private repositories. Free for small teams.

Don't show this again

tabo / django-treebeard

Efficient tree implementations for Django 1.0+ :: https://tabo.pe/projects/django-treebeard/

Clone this repository (size: 602.0 KB): HTTPS / SSH
hg clone https://bitbucket.org/tabo/django-treebeard
hg clone ssh://hg@bitbucket.org/tabo/django-treebeard
commit
0f2a87d336ee
parent
f45c785ede80
parent
b38bf3705bca
branch
1.6.X

merging from 1.61 tag to 1.6.X branch

1
dc6379f01920
2
dc6379f01920
import datetime
3
dc6379f01920
import random
4
dc6379f01920
5
dc6379f01920
from django import forms
6
dc6379f01920
from django.db import transaction
7
dc6379f01920
from django.http import HttpResponseRedirect
8
dc6379f01920
from django.db import connection
9
dc6379f01920
from django.shortcuts import render_to_response, get_object_or_404
10
dc6379f01920
from django.core.cache import cache
11
dc6379f01920
12
dc6379f01920
from tbexample.models import MP_Post, AL_Post, NS_Post
13
dc6379f01920
from tbexample.forms import CommentForm
14
dc6379f01920
15
dc6379f01920
16
dc6379f01920
def treetype2model(treetype):
17
dc6379f01920
    """ Returns the tree model for a given tree type from the url
18
dc6379f01920
    """
19
dc6379f01920
    return {'mp': MP_Post,
20
dc6379f01920
            'al': AL_Post,
21
dc6379f01920
            'ns': NS_Post}[treetype]
22
dc6379f01920
23
dc6379f01920
24
dc6379f01920
@transaction.commit_on_success
25
dc6379f01920
def load_random_data(request, treetype):
26
dc6379f01920
    """ Makes lots of dummy posts.
27
dc6379f01920
    """
28
dc6379f01920
    tbmodel = treetype2model(treetype)
29
dc6379f01920
    data = {'sql_queries': connection.queries,
30
dc6379f01920
            'treetype': treetype}
31
dc6379f01920
32
dc6379f01920
    key = 'treebeard_tbexample_loadfloodprot_%s' % treetype
33
dc6379f01920
    if cache.get(key):
34
dc6379f01920
        return render_to_response('tbexample/loadflood.html', data)
35
dc6379f01920
    cache.set(key, True, 60*5)
36
dc6379f01920
37
dc6379f01920
    interval = range(1,6)
38
dc6379f01920
    vals = {1: 4, 2: 10, 3: 25, 4: 50, 5: 50}
39
dc6379f01920
    for depth in interval:
40
dc6379f01920
        num = vals[depth]
41
dc6379f01920
        if depth > 1:
42
dc6379f01920
            if treetype == 'al':
43
dc6379f01920
                nodes = [obj for obj in tbmodel.objects.all()
44
dc6379f01920
                         if obj.get_depth() == depth-1]
45
dc6379f01920
            else:
46
dc6379f01920
                nodes = list(tbmodel.objects.filter(depth=depth-1))
47
dc6379f01920
        for i in range(num):
48
dc6379f01920
            if depth == 1:
49
dc6379f01920
                meth = tbmodel.add_root
50
dc6379f01920
            else:
51
dc6379f01920
                node = nodes[random.randint(0, len(nodes)-1)]
52
dc6379f01920
                if treetype == 'ns':
53
dc6379f01920
                    node = tbmodel.objects.get(pk=node.id)
54
dc6379f01920
                meth = node.add_child
55
dc6379f01920
            obj = meth(author='author_%d' % (i,),
56
11d2c27832ed
                 comment='lorem ipsum! %d' % (random.randint(1000000000,
57
11d2c27832ed
                                                             9999999999), ),
58
dc6379f01920
                 created=datetime.datetime.now())
59
dc6379f01920
    return render_to_response('tbexample/loaddata.html', data)
60
dc6379f01920
61
dc6379f01920
62
dc6379f01920
@transaction.commit_on_success
63
dc6379f01920
def delete_node(request, treetype, node_id):
64
dc6379f01920
    """ View to remove a message and it's replies
65
dc6379f01920
    """
66
dc6379f01920
    tbmodel = treetype2model(treetype)
67
dc6379f01920
    data = {'sql_queries': connection.queries,
68
dc6379f01920
            'treetype': treetype}
69
dc6379f01920
    node = get_object_or_404(tbmodel, id=node_id)
70
dc6379f01920
    node.delete()
71
dc6379f01920
    return render_to_response('tbexample/delete.html', data)
72
dc6379f01920
73
dc6379f01920
74
dc6379f01920
@transaction.commit_on_success
75
dc6379f01920
def delete_all(request, treetype):
76
dc6379f01920
    """ Remove all messages
77
dc6379f01920
    """
78
dc6379f01920
    tbmodel = treetype2model(treetype)
79
dc6379f01920
    data = {'sql_queries': connection.queries,
80
dc6379f01920
            'treetype': treetype}
81
dc6379f01920
    tbmodel.objects.all().delete()
82
dc6379f01920
    return render_to_response('tbexample/delete.html', data)
83
dc6379f01920
84
dc6379f01920
85
dc6379f01920
@transaction.commit_on_success
86
dc6379f01920
def convo(request, treetype, node_id=None):
87
dc6379f01920
    """ convo view~
88
dc6379f01920
    """
89
dc6379f01920
    tbmodel = treetype2model(treetype)
90
dc6379f01920
    data = {'sql_queries': connection.queries,
91
dc6379f01920
            'treetype': treetype}
92
dc6379f01920
    if node_id:
93
dc6379f01920
        root = get_object_or_404(tbmodel, id=node_id)
94
dc6379f01920
        if root.get_depth() != 1:
95
dc6379f01920
            # meh not really a root node, redirecting...
96
dc6379f01920
            return HttpResponseRedirect('%s#comment_%d' %
97
dc6379f01920
                (root.get_root().get_absolute_url(), root.id))
98
dc6379f01920
    else:
99
dc6379f01920
        root = None
100
dc6379f01920
101
dc6379f01920
    if request.method == 'POST':
102
dc6379f01920
        form = CommentForm(request.POST)
103
dc6379f01920
        form.root = root
104
dc6379f01920
        form.tbmodel = tbmodel
105
dc6379f01920
        if form.is_valid():
106
dc6379f01920
            obj = form.add_method(
107
dc6379f01920
                author=form.cleaned_data['author'],
108
dc6379f01920
                comment=form.cleaned_data['comment'],
109
dc6379f01920
                created=datetime.datetime.now())
110
dc6379f01920
            if not root:
111
dc6379f01920
                root = obj
112
dc6379f01920
            data['link'] = '%s#comment_%d' % \
113
dc6379f01920
                           (root.get_absolute_url(), obj.id)
114
dc6379f01920
            return render_to_response('tbexample/posted.html', data)
115
dc6379f01920
    else:
116
dc6379f01920
        form = CommentForm()
117
dc6379f01920
        form.root = root
118
dc6379f01920
        form.tbmodel = tbmodel
119
dc6379f01920
120
dc6379f01920
    data['form'] = form
121
dc6379f01920
    if node_id:
122
dc6379f01920
        template_html = 'tbexample/convo.html'
123
dc6379f01920
        descendants = root.get_descendants()
124
dc6379f01920
        nodes = [(root, len(descendants))] + [
125
dc6379f01920
            (node, node.get_children_count())
126
dc6379f01920
            for node in descendants
127
dc6379f01920
        ]
128
dc6379f01920
        data['mainpage'] = False
129
dc6379f01920
        data['nodes'] = nodes
130
dc6379f01920
        form.fields['parent'].widget = forms.TextInput()
131
dc6379f01920
    else:
132
dc6379f01920
        template_html = 'tbexample/main.html'
133
dc6379f01920
        data['mainpage'] = True
134
dc6379f01920
        data['nodes'] = [(node, node.descendants_count)
135
dc6379f01920
                         for node in tbmodel.get_descendants_group_count()]
136
dc6379f01920
        data['total_comments'] = len(data['nodes']) + \
137
dc6379f01920
                                 sum([count for _, count in data['nodes']])
138
dc6379f01920
        data['treetype'] = treetype
139
dc6379f01920
    return render_to_response(template_html, data)
140
dc6379f01920
141
dc6379f01920
142
07a8db24f7e4
def choose(request):
143
07a8db24f7e4
    return render_to_response('tbexample/choose.html', {})
144
dc6379f01920
145
dc6379f01920