source: trunk/oforgetools/projects/views.py @ 854

Revision 854, 12.2 KB checked in by rlixandru, 2 years ago (diff)

fixed indent

Line 
1#
2# Copyright 2008 Optaros, Inc
3#
4import random
5import re
6import sys
7import logging
8import traceback
9
10from logging import handlers
11
12import cjson
13
14from django.core.paginator import Paginator
15from django.core.urlresolvers import reverse
16from django.http import HttpResponse, HttpResponseRedirect
17from django.template import Context, RequestContext, loader
18from django.shortcuts import render_to_response
19
20from oforgetools.projects.models import Project, ProjectManager, Ticket, CustomProjectAttributes
21from oforgetools.projects.models import OForgeProfile, OForgeProfileManager
22from oforgetools.projects.forms import CreateProjectForm
23from oforgetools import settings
24from tagging.models import Tag, TaggedItem
25
26from oforge.api import OForge
27
28oforge_logger_initialized = False
29
30def index(request):
31    data = {}
32    data['my_project_count'] = _get_user_projects_count(request.user)
33    data['my_tickets_count'] = _get_user_tickets_count(request.user.username)
34    data['featured_projects'] = _get_featured_projects()
35
36    return render_to_response('projects/index.html', 
37                              {'data': data},
38                              context_instance=RequestContext(request))
39
40def search(request):
41    data = {'types': ProjectManager.reference_data('type'),
42            'phases': CustomProjectAttributes.reference_values('phase'),
43            'regions': CustomProjectAttributes.reference_values('region') }
44    data['my_project_count'] = _get_user_projects_count(request.user)
45    data['my_tickets_count'] = _get_user_tickets_count(request.user.username)
46
47    return render_to_response('projects/search.html', 
48                              {'data': data},
49                              context_instance=RequestContext(request))
50
51def tickets(request):
52    data = {}
53    ticket_set = _get_tickets(owner=request.user.username)
54    data['tickets'] = ticket_set
55    data['my_project_count'] = _get_user_projects_count(request.user)
56    data['my_tickets_count'] = _get_user_tickets_count(request.user.username)
57    return render_to_response('projects/tickets.html',
58                              {'data': data},
59                              context_instance=RequestContext(request))
60
61def createprojectform(request):
62    logging.debug(sys.path)
63    data = {'my_project_count': 0}
64    if request.method == 'POST':
65        form = CreateProjectForm(request.POST)
66        data['form'] = form
67        if form.is_valid():
68            name = form.cleaned_data['name']
69            client = form.cleaned_data['client']
70            display_name = form.cleaned_data['display_name']
71            admins = form.cleaned_data['admins']
72            type = form.cleaned_data['type']
73            createsvn = form.cleaned_data['createsvn']
74            svn_template = form.cleaned_data['svn_template']
75            default_workspace = form.cleaned_data['default_workspace']
76            usepostgres = form.cleaned_data['use_postgres']
77            versioning_engine = form.cleaned_data['versioning_engine']
78            tags = form.cleaned_data['tags']
79            oforge = OForge(settings.OFORGE_CONFIGFILE)
80            try:
81                if not oforge_logger_initialized:
82                    _init_oforge_logger()
83                oforge.createproject(
84                    name,
85                    display_name=display_name,
86                    admins=admins,
87                    type=type,
88                    createsvn=createsvn,
89                    svntemplate=svn_template,
90                    defaultworkspace=default_workspace,
91                    postgres=usepostgres,
92                    versioning_engine=versioning_engine,
93                    tags=tags
94                )
95                new_proj = Project.objects.filter(name=name)[0]
96                new_proj.client = client
97                new_proj.save()
98                for i in request.POST.items():
99                    if i[0].startswith('custom_attribute_'):
100                        attr_name = i[0].replace('custom_attribute_', '', 1)
101                        new_proj.set_attribute(attr_name, i[1])
102                flash = "Project <a href='/trac/%s'>%s</a> was created " \
103                        "successfully."%(name, display_name)
104                request.user.message_set.create(message=flash)
105            except Exception, e:
106                print >> sys.stderr, traceback.format_exc()
107                request.user.message_set.create(message=("Error: %s"%(
108                    e.message or 'unknown')))
109                request.user.message_set.create(
110                        message='An error occurred.  Please contact the " \
111                                "System Administrator.')
112            return HttpResponseRedirect(
113                reverse('oforgetools.projects.views.createprojectform'))
114    else:
115        data['my_project_count'] = _get_user_projects_count(request.user)
116        data['my_tickets_count'] = _get_user_tickets_count(
117                request.user.username)
118        defaults = settings.CREATE_PROJECT_DEFAULTS
119        data['form'] = CreateProjectForm()
120        data['defaults'] = {}
121        if defaults.get('svntemplate', None):
122            data['defaults']['svn_template'] = defaults.get('svntemplate') 
123        if defaults.get('defaultworkspace', None):
124            data['defaults']['default_workspace'] = \
125                defaults.get('defaultworkspace') 
126        if defaults.get('usepostgres', True):
127            data['defaults']['use_postgres'] = defaults.get('usepostgres', 
128                    True) 
129    return render_to_response('projects/createproject.html', 
130        {'data': data},
131        context_instance=RequestContext(request))
132
133def _init_oforge_logger():
134    logger = logging.getLogger('OForge')
135    logger.setLevel(logging.DEBUG)
136    slh = handlers.SysLogHandler('/dev/log')
137    slh.setLevel(logging.DEBUG)
138    formatter = logging.Formatter("[%(name)s]: %(levelname)s: %(message)s")
139    slh.setFormatter(formatter)
140    logger.addHandler(slh)
141    oforge_logger_initialized = True
142
143def autocomplete(request):
144    field = request.REQUEST.get('field')
145    query = request.REQUEST.get('q')
146    default = request.REQUEST.get('default')
147    words = []
148    if field == 'client':
149        words = Project.objects.filter(client__icontains=query
150                ).order_by('client').distinct().values_list(
151                        'client', flat=True)
152    elif field == 'display_name':
153        words = Project.objects.filter(display_name__icontains=query
154                ).order_by('display_name').distinct().values_list(
155                        'display_name', flat=True)
156    elif field == 'tags':
157        matching_tags = Tag.objects.filter(name__icontains=query).order_by('name')
158        words = [tag.name for tag in matching_tags]
159
160    words_list = list(words)
161    if default and default <> '' and re.match(query, default, re.IGNORECASE):
162        words_list.append(default)
163        words_list.sort()
164    return HttpResponse(words_list and '\n'.join(words_list) or '')
165
166
167def dashboard_select(request):
168    id = request.REQUEST.get('id')
169    selected = request.REQUEST.get('selected') == 'true'
170
171    try:
172        user_profile = OForgeProfileManager().get_user_profile(user=request.user)
173        project = Project.objects.get(id=id)
174        if selected:
175            user_profile.dashboard_projects.add(project)
176        else:
177            user_profile.dashboard_projects.remove(project)
178        user_profile.save()
179    except:
180        logging.warning("Problem updating user projects: %s", sys.exc_info()[0])
181   
182    return HttpResponse(cjson.encode({'my_project_count':user_profile.dashboard_projects.count()}))
183
184def projects_json(request):
185    user_projects=[]
186    try:
187        user_profile = OForgeProfileManager().get_user_profile(user=request.user)
188        user_projects = user_profile.dashboard_projects.all()
189    except:
190        logging.warning("Problem loading user projects: %s", sys.exc_info()[0])
191
192    page = _get_projects_by_request(request)
193    data = {
194        'page': page.number,
195        'total': page.paginator.num_pages,
196        'records': page.paginator.count
197    }
198   
199    rows = []   
200    for project in page.object_list:
201        p = {}
202        p['id'] = project.id
203        p['url'] = project.url()
204        p['type'] = project.type
205        p['state'] = project.state
206        p['dashboard'] = project in user_projects and 'true' or 'false'
207        p['name'] = project.name
208        p['client'] = project.client
209        p['display_name'] = project.display_name
210        p['start_date'] = str(project.start_date.date())
211        p['end_date'] = str(project.end_date or '')
212        for attr in project.customprojectattributes_set.values():
213            p['custom_attribute_%s'%(attr['name'])] = attr['value'] or ''
214        p['tags'] = ', '.join([tag.name for tag in project.tags])
215        rows.append(p)
216    data['rows'] = rows
217    return HttpResponse(cjson.encode(data))
218
219def _get_tickets(page=1, rp=50, sortname='project', sortorder='acs',
220        owner=None):
221    ticket_set = Ticket.objects.exclude(status='closed')
222    if owner:
223        ticket_set = ticket_set.filter(owner=owner)
224    return ticket_set
225
226def _get_projects(page=1, rp=50, sortname='display_name', sortorder='asc', 
227         display_name=None, type=None, state=None, client=None,
228        tags=None, user=None, dashboard=None, 
229        start_date_range=None):
230   
231    project_set = Project.objects
232    project_set = project_set.exclude(type='hidden')
233
234    if dashboard:
235        project_set = OForgeProfileManager().get_user_profile(user=user).dashboard_projects.all()
236    else:
237        if tags and len(tags):
238                # FIXME: appears to still be getting UNION rather than INTERSECTION
239            project_set=TaggedItem.objects.get_intersection_by_model(Project, tags)
240        if client and client <> '':
241            project_set = project_set.filter(client__icontains=client)
242        if display_name and display_name <> '':
243            project_set = project_set.filter(display_name__icontains=display_name)
244        if type and type <> '':
245            project_set = project_set.filter(type=type)
246        if state and state <> '':
247            project_set = project_set.filter(state=state)
248        if start_date_range:
249            project_set = project_set.filter(start_date__gt=start_date_range[0]).\
250                filter(start_date__lt=start_date_range[1])
251
252    if Project._meta.get_all_field_names().__contains__(sortname):
253        order_by = "%s%s"%(sortorder == 'desc' and '-' or '', sortname)
254        project_set = project_set.order_by(order_by)
255
256    paginator = Paginator(project_set, rp)
257    return paginator.page(page)
258
259def _get_projects_by_request(request):
260    dashboard = request.REQUEST.get('myprojects', None)
261    client = request.REQUEST.get('client', None)
262    display_name = request.REQUEST.get('display_name', None)
263    type = request.REQUEST.get('type', None)
264    state = request.REQUEST.get('state', 'Open')
265    if state == 'All':
266        state = None
267    tags = request.REQUEST.get('tags', None)
268    page = request.REQUEST.get('page', 1)
269    rp = request.REQUEST.get('rows', 50)
270    sortname = request.REQUEST.get('sidx', 'display_name')
271    sortorder = request.REQUEST.get('sord', None)
272    start_date_range_string = request.REQUEST.get('start_date_range', None)
273    start_date_range = None
274    if start_date_range_string and start_date_range_string <> '':
275        SDRre = '^(\d{2}/\d{2}/\d{4})\s-\s(\d{2}/\d{2}/\d{4})$'
276        match = re.match(SDRre, start_date_range_string)
277        if match:
278            start_date_range = match.groups()
279    return _get_projects(page=int(page), rp=int(rp), 
280            sortname=sortname, sortorder=sortorder, client=client,
281            display_name=display_name, type=type, state=state,
282            tags=tags, user=request.user, dashboard=dashboard, 
283            start_date_range=start_date_range)
284
285def _get_user_projects_count(user):
286    user_profile = OForgeProfileManager().get_user_profile(user)
287    return user_profile.dashboard_projects.count()
288
289def _get_user_tickets_count(username):
290    return Ticket.objects.exclude(status='closed').filter(owner=username).count()
291
292def _get_featured_projects():
293    return {
294       'featured':TaggedItem.objects.get_intersection_by_model(Project, 'featured')[:4],
295       'latest': Project.objects.order_by('start_date')[:4],
296       'popular':TaggedItem.objects.get_intersection_by_model(Project, 'popular')[:4],
297       'resource':TaggedItem.objects.get_intersection_by_model(Project, 'resource')[:4],
298       } 
Note: See TracBrowser for help on using the repository browser.