aboutsummaryrefslogtreecommitdiffstats
path: root/97suifangqa/apps/indicator/views.py
diff options
context:
space:
mode:
Diffstat (limited to '97suifangqa/apps/indicator/views.py')
-rw-r--r--97suifangqa/apps/indicator/views.py416
1 files changed, 416 insertions, 0 deletions
diff --git a/97suifangqa/apps/indicator/views.py b/97suifangqa/apps/indicator/views.py
new file mode 100644
index 0000000..1175d62
--- /dev/null
+++ b/97suifangqa/apps/indicator/views.py
@@ -0,0 +1,416 @@
+# -*- coding: utf-8 -*-
+
+"""
+apps/indicator views
+
+"""
+
+from django.contrib.auth.decorators import login_required
+from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden
+from django.shortcuts import render_to_response, get_object_or_404
+# CRSF
+from django.template import RequestContext
+
+from indicator import models as im
+from indicator.forms import *
+from indicator.tools import *
+
+import re
+import datetime
+
+
+def get_indicator_view(request, **kwargs):
+ idict = get_indicator(**kwargs)
+ return HttpResponse("%s" % idict)
+
+
+@login_required
+def get_followed_indicator_view(request, **kwargs):
+ idict = get_followed_indicator(request.user.id, **kwargs)
+ return HttpResponse("%s" % idict)
+
+
+@login_required
+def get_unfollowed_indicator_view(request, **kwargs):
+ idict = get_unfollowed_indicator(request.user.id, **kwargs)
+ return HttpResponse("%s" % idict)
+
+
+@login_required
+def recommend_indicator_view(request, **kwargs):
+ ilist = recommend_indicator(request.user.id, **kwargs)
+ return HttpResponse("%s" % ilist)
+
+
+# follow_indicator {{{
+@login_required
+def follow_indicator(request, indicator_id):
+ """
+ 用户关注指标
+ """
+ try:
+ indicator = im.Indicator.objects.get(pk=int(indicator_id))
+ ui, created = im.UserIndicator.objects.get_or_create(
+ user=request.user)
+ ui.followedIndicators.add(indicator)
+ return { 'success': True }
+ except:
+ return { 'success': False }
+# }}}
+
+
+# unfollow_indicator {{{
+@login_required
+def unfollow_indicator(request, indicator_id):
+ """
+ 用户取消关注指标
+ """
+ try:
+ indicator = im.Indicator.objects.get(pk=int(indicator_id))
+ ui, created = im.UserIndicator.objects.get_or_create(
+ user=request.user)
+ ui.followedIndicators.remove(indicator)
+ return { 'success': True }
+ except:
+ return { 'success': False }
+# }}}
+
+
+# get_record_view {{{
+@login_required
+def get_record_view(request, indicator_id, date_range, **kwargs):
+ """
+ get IndicatorRecord record
+ """
+ indicator_id = int(indicator_id)
+ # regex to match given 'date_range' (yyyymmdd-yyyymmdd)
+ p = re.compile(r'^(?P<b_y>\d{4})(?P<b_m>\d{2})(?P<b_d>\d{2})-(?P<e_y>\d{4})(?P<e_m>\d{2})(?P<e_d>\d{2})$')
+ m = p.match(date_range)
+ # begin date
+ begin_y = int(m.group('b_y'))
+ # remove '^0'; avoid the '0???' octal number
+ begin_m = int(re.sub(r'^0', '', m.group('b_m')))
+ begin_d = int(re.sub(r'^0', '', m.group('b_d')))
+ # end date
+ end_y = int(m.group('b_y'))
+ end_m = int(re.sub(r'^0', '', m.group('e_m')))
+ end_d = int(re.sub(r'^0', '', m.group('e_d')))
+ # date
+ begin = datetime.date(begin_y, begin_m, begin_d)
+ end = datetime.date(end_y, end_m, end_d)
+ data = get_record(request.user.id, indicator_id=indicator_id,
+ begin=begin, end=end, **kwargs)
+ return HttpResponse("%s" % data)
+# }}}
+
+
+
+###########################################################
+###### forms ######
+
+## add_edit_category # {{{
+@login_required
+def add_edit_category(request, category_id=None, template='simple.html'):
+ """
+ add/edit category: 'models.IndicatorCategory'
+ for 'staff' or 'normal user'
+ """
+ # get or create model instance
+ if category_id:
+ category_id = int(category_id)
+ category = get_object_or_404(im.IndicatorCategory,
+ id=category_id)
+ action = 'Edit'
+ # check the user
+ # 'staff' can edit all data;
+ # normal users can only edit their own.
+ if category.addByUser != request.user and (
+ not request.user.is_staff):
+ return HttpResponseForbidden()
+ else:
+ category = im.IndicatorCategory(addByUser=request.user)
+ action = 'Add'
+
+ if request.method == 'POST':
+ form = IndicatorCategoryForm(request.POST, instance=category)
+ if form.is_valid():
+ # form posted and valid
+ # save form to create/update the model instance
+ form.save()
+ # redirect url, avoid page reload/refresh
+ return HttpResponseRedirect('/indicator/done/')
+ else:
+ # form with data of the specified instance
+ form = IndicatorCategoryForm(instance=category)
+
+ return render_to_response(template, {
+ 'object': 'IndicatorCategory',
+ 'action': action,
+ 'form': form,
+ }, context_instance=RequestContext(request))
+# }}}
+
+
+# add_edit_indicator # {{{
+@login_required
+def add_edit_indicator(request, indicator_id=None, template='simple.html'):
+ """
+ add/edit indicator: 'models.Indicator'
+ for 'staff' or 'normal user'
+ """
+ if indicator_id:
+ indicator_id = int(indicator_id)
+ indicator = get_object_or_404(im.Indicator,
+ id=indicator_id)
+ action = 'Edit'
+ # check the user
+ # 'staff' can edit all data;
+ # normal users can only edit their own.
+ if indicator.addByUser != request.user and (
+ not request.user.is_staff):
+ return HttpResponseForbidden()
+ else:
+ indicator = im.Indicator(addByUser=request.user)
+ action = 'Add'
+
+ if request.method == 'POST':
+ form = IndicatorForm(request.POST, instance=indicator)
+ if form.is_valid():
+ # form posted and valid
+ form.save()
+ # redirect url, avoid page reload/refresh
+ return HttpResponseRedirect('/indicator/done/')
+ else:
+ # form with instance
+ form = IndicatorForm(instance=indicator)
+
+ return render_to_response(template, {
+ 'object': 'Indicator',
+ 'action': action,
+ 'form': form,
+ }, context_instance=RequestContext(request))
+# }}}
+
+
+## add_edit_unit {{{
+@login_required
+def add_edit_unit(request, unit_id=None, template='simple.html'):
+ """
+ add unit for indicator
+ """
+ if unit_id:
+ unit_id = int(unit_id)
+ unit = get_object_or_404(im.Unit, id=unit_id)
+ action = 'Edit'
+ # check the user
+ # 'staff' can edit all data;
+ # normal users can only edit their own.
+ if unit.addByUser != request.user and (
+ not request.user.is_staff):
+ return HttpResponseForbidden()
+ else:
+ unit = im.Unit(addByUser=request.user)
+ action = 'Add'
+
+ if request.method == 'POST':
+ form = UnitForm(request.POST, instance=unit)
+ if form.is_valid():
+ # form posted and valid
+ form.save()
+ # redirect url, avoid page reload/refresh
+ return HttpResponseRedirect('/indicator/done/')
+ else:
+ # form with instance
+ form = UnitForm(instance=unit)
+
+ return render_to_response(template, {
+ 'object': 'Unit',
+ 'action': action,
+ 'form': form,
+ }, context_instance=RequestContext(request))
+# }}}
+
+
+## add_edit_confine {{{
+@login_required
+def add_edit_confine(request, confine_id=None, template='simple.html'):
+ """
+ InnateConfine
+ add confines for indicator
+ """
+ if confine_id:
+ confine_id = int(confine_id)
+ confine = get_object_or_404(im.InnateConfine, id=confine_id)
+ action = 'Edit'
+ # check the user
+ # 'staff' can edit all data;
+ # normal users can only edit their own.
+ if confine.addByUser != request.user and (
+ not request.user.is_staff):
+ return HttpResponseForbidden()
+ else:
+ confine = im.InnateConfine(addByUser=request.user)
+ action = 'Add'
+
+ if request.method == 'POST':
+ form = InnateConfineForm(request.POST, instance=confine)
+ if form.is_valid():
+ # form posted and valid
+ form.save()
+ # redirect url, avoid page reload/refresh
+ return HttpResponseRedirect('/indicator/done/')
+ else:
+ # form with instance
+ form = InnateConfineForm(instance=confine)
+
+ return render_to_response(template, {
+ 'object': 'InnateConfine',
+ 'action': action,
+ 'form': form,
+ }, context_instance=RequestContext(request))
+# }}}
+
+
+## add_edit_record {{{
+@login_required
+def add_edit_record(request, record_id=None, template='simple.html'):
+ """
+ add/edit 'IndicatorRecord'
+
+ staff 能自由地修改所有的记录,并且无需填写"修改原因";
+ 普通用户只能修改自己的记录,而且必须填写"修改原因" -> RecordHistory
+
+ TODO:
+ * 当用户选择好"indicator"后,重新筛选"unit",只提供与"indicator"
+ 对应的"unit"供选择;
+ * 对"普通用户"增加限制,修改数据"记录"时必须同时提交"修改原因",
+ 对应模型"RecordHistory"。
+ """
+ if record_id:
+ record_id = int(record_id)
+ record = get_object_or_404(im.IndicatorRecord, id=record_id)
+ action = 'Edit'
+ # check the user
+ if request.user.is_staff:
+ # 'staff' can edit all data;
+ pass
+ elif request.user == record.user:
+ # user modify the record
+ return HttpResponse("Not finished yet ...")
+ #return modify_record(request, record_id)
+ else:
+ return HttpResponseForbidden()
+ else:
+ record = im.IndicatorRecord(user=request.user)
+ action = 'Add'
+
+ if request.method == 'POST':
+ form = IndicatorRecordForm(request.POST, instance=record)
+ if form.is_valid():
+ #raise ValueError
+ form.save()
+ # redirect url, avoid page reload/refresh
+ return HttpResponseRedirect('/indicator/done/')
+ else:
+ # form with instance
+ form = IndicatorRecordForm(instance=record)
+
+ return render_to_response(template, {
+ 'object': 'IndicatorRecord',
+ 'action': action,
+ 'form': form,
+ }, context_instance=RequestContext(request))
+# }}}
+
+
+## modify_record {{{
+@login_required
+def modify_record(request, record_id=None, template='simple.html'):
+ """
+ modify an existing IndicatorRecord
+
+ TODO:
+ a new 'RecordHistory' is added to record the modification reason
+ and backup the original data
+ """
+ if record_id:
+ record_id = int(record_id)
+ record = get_object_or_404(im.IndicatorRecord, id=record_id)
+ action = 'Edit'
+ # check the user
+ if request.user.is_staff:
+ # 'staff' can edit all data;
+ return add_edit_record(request, record_id)
+ elif request.user == record.user:
+ # user modify the record
+ action = 'Modify'
+ pass
+ else:
+ return HttpResponseForbidden()
+ else:
+ return add_edit_record(request)
+
+ if request.method == 'POST':
+ form = IndicatorRecordForm(request.POST, instance=record)
+ if form.is_valid():
+ # form posted and valid
+ # TODO
+ raise ValueError(u"该功能尚未完整实现")
+ form.save()
+ # redirect url, avoid page reload/refresh
+ return HttpResponseRedirect('/indicator/done/')
+ else:
+ # form with instance
+ form = IndicatorRecordForm(instance=record)
+
+ return render_to_response(template, {
+ 'object': 'IndicatorRecord',
+ 'action': action,
+ 'form': form,
+ }, context_instance=RequestContext(request))
+## }}}
+
+
+## add_recordhistory {{{
+@login_required
+def add_recordhistory(request, record_id, template='simple.html'):
+ """
+ add 'RecordHistory' for a record by given
+
+ 'staff' should use the 'admin' interface.
+ """
+ record_id = int(record_id)
+ record = get_object_or_404(im.IndicatorRecord, id=record_id)
+ recordhistory = im.RecordHistory(indicatorRecord=record)
+ action = 'Add'
+ # check the user
+ if request.user != record.user:
+ return HttpResponseForbidden()
+
+ if request.method == 'POST':
+ form = RecordHistoryForm(request.POST, instance=recordhistory)
+ if form.is_valid():
+ # form posted and valid
+ form.save()
+ # redirect url, avoid page reload/refresh
+ return HttpResponseRedirect('/indicator/done/')
+ else:
+ # form with instance
+ form = RecordHistoryForm(instance=recordhistory)
+
+ return render_to_response(template, {
+ 'object': 'RecordHistory',
+ 'action': action,
+ 'form': form,
+ }, context_instance=RequestContext(request))
+# }}}
+
+
+###########################################################
+
+### test_view ###
+def test_view(request, **kwargs):
+ html = '<html><body>%s</body></html>' % u"正文测试内容"
+ text = u"中文测试"
+ return HttpResponse("%s" % request)
+