aboutsummaryrefslogtreecommitdiffstats
path: root/97suifangqa/apps/recommend/views.py
diff options
context:
space:
mode:
Diffstat (limited to '97suifangqa/apps/recommend/views.py')
-rw-r--r--97suifangqa/apps/recommend/views.py229
1 files changed, 226 insertions, 3 deletions
diff --git a/97suifangqa/apps/recommend/views.py b/97suifangqa/apps/recommend/views.py
index 02d5616..d3294a2 100644
--- a/97suifangqa/apps/recommend/views.py
+++ b/97suifangqa/apps/recommend/views.py
@@ -4,14 +4,237 @@
views for apps/recommend
"""
-from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden, Http404
+import itertools
+try:
+ import json
+except ImportError:
+ from django.utils import simplejson as json
+
+from django.http import (
+ HttpResponse, HttpResponseRedirect,
+ HttpResponseForbidden, Http404
+)
+from django.views.defaults import permission_denied
from django.shortcuts import render, get_object_or_404
+from django.contrib.auth.decorators import login_required
+
+from recommend import models as rm
+from sciblog.models import SciBlog
+from tools import make_tag, get_research_config, make_config_display
-# index
+# index {{{
def recommend_index(request):
"""
index view for apps/recommend
"""
- return HttpResponse("recommend index")
+ template_name = 'recommend/recommend_index.html'
+ blogs = SciBlog.objects.all().order_by('id')
+ blog_list = []
+ for blog in blogs:
+ if blog.research_configs.all():
+ has_info = True
+ else:
+ has_info = False
+ b = {
+ 'id': blog.id,
+ 'title': blog.title,
+ 'has_info': has_info,
+ }
+ blog_list.append(b)
+ #
+ context = {
+ 'blog_list': blog_list,
+ }
+ return render(request, template_name, context)
+# }}}
+
+
+# add_edit_blog_info {{{
+@login_required
+def add_edit_blog_info(request, blog_id=None):
+ """
+ add/edit the infomation (used to recommend blog for user)
+ of the given blog
+
+ ONLY *STAFF* ALLOWED
+ """
+ template_name = 'recommend/add_edit_blog_info.html'
+ template_name_error = 'recommend/add_edit_blog_info_error.html'
+ context_error = {
+ 'no_indicator': False,
+ 'no_indicator_atom': False,
+ 'no_treat_response': False,
+ 'ResearchIndicatorName': rm.ResearchIndicator._meta.verbose_name_plural,
+ 'ResearchAtomName': rm.ResearchAtom._meta.verbose_name_plural,
+ 'TreatResponseName': rm.TreatResponse._meta.verbose_name_plural,
+ }
+ # check user type
+ if not request.user.is_staff:
+ #return permission_denied(request)
+ html = """
+ <h1>403 Forbidden</h1>
+ <h2>ONLY *STAFF* ALLOWED</h2>
+ """
+ return HttpResponseForbidden(html)
+ ## blog object
+ try:
+ blog_id = int(blog_id)
+ blog_obj = get_object_or_404(SciBlog, id=blog_id)
+ except ValueError:
+ raise ValueError(u"Error: blog_id='%s'错误" % blog_id)
+ except SciBlog.DoesNotExist:
+ raise ValueError(u"Error: SciBlog id='%s'不存在" % blog_id)
+ context_error['blog'] = blog_obj
+ ## research indicators & check
+ r_indicators = blog_obj.research_indicators.all()
+ r_indicators_id = [ri.id for ri in r_indicators]
+ rind_num = len(r_indicators)
+ # check indicator
+ if rind_num == 0:
+ context_error['no_indicator'] = True
+ return render(request, template_name_error, context_error)
+ # check indicator research atoms
+ no_atom_ri = []
+ for ri in r_indicators:
+ if not ri.research_atoms.all():
+ context_error['no_indicator_atom'] = True
+ no_atom_ri.append({
+ 'id': ri.id,
+ 'display': ri.__unicode__(),
+ })
+ #
+ if context_error['no_indicator_atom']:
+ context_error['no_atom_ri'] = no_atom_ri
+ return render(request, template_name_error, context_error)
+ # treat response & check
+ treat_responses = rm.TreatResponse.objects.all()
+ if not treat_responses:
+ context_error['no_treat_response'] = True
+ return render(request, template_name_error, context_error)
+ else:
+ treat_responses_list = [tr.dump() for tr in treat_responses]
+ treat_responses_objs = {'name': rm.TreatResponse._meta.verbose_name_plural}
+ for tr in treat_responses:
+ id = tr.id
+ treat_responses_objs['id%s'%id] = tr.dump()
+ ## research indicator numbers (categories by number)
+ rind_categories = {}
+ for i in range(1, rind_num+1):
+ comb = list(itertools.combinations(r_indicators_id, i))
+ # tag all combinations
+ comb_tagged = []
+ for c in comb:
+ tag = make_tag(ids=c, tag='comb')
+ comb_tagged.append({'tag': tag, 'data': c})
+ rind_categories['N%s'%i] = comb_tagged
+ # dump used research indicators
+ rind_objs = {}
+ for id in r_indicators_id:
+ ri_obj = get_object_or_404(rm.ResearchIndicator, id=id)
+ ri_data = ri_obj.dump()
+ # atoms
+ ri_data['atoms_id'] = [atom.id
+ for atom in ri_obj.research_atoms.all()]
+ rind_objs['id%s'%id] = ri_data
+ ## research configs
+ rind_combs = []
+ for ric in rind_categories.values():
+ rind_combs = rind_combs + ric
+ #
+ research_configs = {}
+ for ric in rind_combs:
+ key = ric['tag']
+ atoms_id_list = []
+ for id in ric['data']:
+ atoms_id_list.append(rind_objs['id%s'%id]['atoms_id'])
+ # itertools to generate combinations
+ configs = list(itertools.product(*atoms_id_list))
+ configs_tagged = []
+ # generate config data for front page
+ for conf in configs:
+ config_obj = get_research_config(atoms=conf)
+ if config_obj:
+ config_data = config_obj.dump()
+ else:
+ config_data = {}
+ tag = make_tag(ids=conf, tag='conf')
+ display = make_config_display(atoms=conf)
+ config_data.update({
+ 'tag': tag,
+ 'data': conf,
+ 'display': display,
+ })
+ configs_tagged.append(config_data)
+ # TODO
+ data = {
+ 'rind_ids': list(ric['data']),
+ 'configs': configs_tagged,
+ }
+ research_configs[key] = data
+ ## context
+ context = {
+ 'blog': blog_obj,
+ 'rind_num': rind_num,
+ 'rind_objs_json': json.dumps(rind_objs),
+ 'rind_combs_json': json.dumps(rind_combs),
+ 'rind_categories_json': json.dumps(rind_categories),
+ 'research_configs_json': json.dumps(research_configs),
+ 'treat_responses_list_json': json.dumps(treat_responses_list),
+ 'treat_responses_objs_json': json.dumps(treat_responses_objs),
+ }
+ return render(request, template_name, context)
+# }}}
+
+
+# ajax add_edit_configs {{{
+@login_required
+def ajax_add_edit_configs(request):
+ """
+ response to the ajax post configs data
+ """
+ data = {'failed': True}
+ if request.is_ajax() and request.method == 'POST':
+ #print request.POST.dict()
+ configs_list = json.loads(request.POST.get('configs_list'))
+ blog_id = int(request.POST.get('blog_id'))
+ blog_obj = get_object_or_404(SciBlog, id=blog_id)
+ #print configs_list
+ for conf in configs_list:
+ if conf['action'] == 'add':
+ # add config
+ tr_obj = get_object_or_404(rm.TreatResponse,
+ id=conf['treatResponse_id'])
+ new_conf_obj = rm.ResearchConfig.objects.create(
+ blog=blog_obj, treatResponse=tr_obj,
+ weight=conf['weight'])
+ new_conf_obj.save()
+ # add m2m researchAtoms
+ for atom_id in conf['data']:
+ atom_obj = get_object_or_404(rm.ResearchAtom,
+ id=atom_id)
+ new_conf_obj.researchAtoms.add(atom_obj)
+ new_conf_obj.save()
+ elif conf['action'] == 'delete':
+ # delete config
+ conf_obj = get_object_or_404(rm.ResearchConfig,
+ id=conf['id'])
+ conf_obj.delete()
+ elif conf['action'] == 'edit':
+ # edit config
+ conf_obj = get_object_or_404(rm.ResearchConfig,
+ id=conf['id'])
+ conf_obj.weight = conf['weight']
+ tr_obj = get_object_or_404(rm.TreatResponse,
+ id=conf['treatResponse_id'])
+ conf_obj.treatResponse = tr_obj
+ conf_obj.save()
+ else:
+ # action==None / unknown action
+ pass
+ data = {'failed': False}
+ #
+ return HttpResponse(json.dumps(data), mimetype='application/json')
+# }}}
+