# Copyright (c) 2011, 2012 Free Software Foundation # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from django.http import * from reversion.models import * from gstudio.models import * from django.template import RequestContext from django.shortcuts import render_to_response from django.views.generic.date_based import object_detail from reversion.helpers import * import pprint from gstudio.models import * from reversion.models import * from gstudio.views.decorators import protect_nodetype from gstudio.views.decorators import update_queryset import ast def history(request,ssid,version_no): # iden=request.GET["id"] nt1=Version.objects.get(id=ssid) nt=nt1.object.ref ver_dict=nt.version_info(ssid) ver_nbh=ver_dict['nbhood'] ver_nbh_dict=ast.literal_eval(ver_nbh) content=ver_dict['content'] content=content[3:-4] ver_nbh_dict['content']=content variables = RequestContext(request,{'ver_nbh_dict':ver_nbh_dict ,'nt':nt,'ssid':ssid,'version_no':version_no}) template="gstudio/display.html" return render_to_response(template,variables) def get_version_counter(value): counter1=str(value) index=counter1.rfind(".") counter1=counter1[index+1:] version_no=int(counter1) return version_no def get_diff_from_dict(ver_new_nbh_dict,ver_old_nbh_dict,field): ver_new="" ver_old="" diffs="" if ver_new_nbh_dict[field] or ver_old_nbh_dict[field]: for each in ver_new_nbh_dict[field]: ver_new+=str(each)+"," ver_new=ver_new[0:-1] for each in ver_old_nbh_dict[field]: ver_old+=str(each)+"," ver_old=ver_old[0:-1] diffs = dmp.diff_main(ver_new, ver_old) return diffs def compare_history(request,ssid): ssid1=ssid version_counter1=request.GET["group1"] version_no1=get_version_counter(version_counter1) version_counter2=request.GET["group2"] version_no2=get_version_counter(version_counter2) counter2=float(version_counter2) ssid2=int(counter2) ver_obj=Version.objects.get(id=ssid1) ot=ver_obj.object.ref pp=pprint.PrettyPrinter(indent=4) ver_new_dict=ot.version_info(ssid1) content=str(ver_new_dict['content']) content=content[3:-4] ver_new_dict['content']=content ver_old_dict=ot.version_info(ssid2) content=str(ver_old_dict['content']) content=content[3:-4] ver_old_dict['content']=content ver_new_nbh=ver_new_dict['nbhood'] ver_new_nbh_dict=ast.literal_eval(ver_new_nbh) ver_old_nbh=ver_old_dict['nbhood'] ver_old_nbh_dict=ast.literal_eval(ver_old_nbh) compare_dict={} for each in ver_new_nbh_dict: ver_new="" ver_old="" if each=='altnames': if ver_new_nbh_dict['altnames'] or ver_old_nbh_dict['altnames']: ver_new+=ver_new_nbh_dict['altnames'] ver_old+=ver_old_nbh_dict['altnames'] diffs = dmp.diff_main(ver_new, ver_old) compare_dict['altnames']=dmp.diff_prettyHtml(diffs) elif each=='title': if ver_new_nbh_dict['title'] or ver_old_nbh_dict['title']: ver_new+=ver_new_nbh_dict['title'] ver_old+=ver_old_nbh_dict['title'] diffs = dmp.diff_main(ver_new, ver_old) compare_dict['title']=dmp.diff_prettyHtml(diffs) elif each =='plural': if ver_new_nbh_dict['plural'] or ver_old_nbh_dict['plural']: ver_new+=ver_new_nbh_dict['plural'] ver_old+=ver_old_nbh_dict['plural'] diffs = dmp.diff_main(ver_new, ver_old) compare_dict['plural']=dmp.diff_prettyHtml(diffs) elif each =='contains_members': diffs=get_diff_from_dict(ver_new_nbh_dict,ver_old_nbh_dict,each) compare_dict['contains_members']=dmp.diff_prettyHtml(diffs) elif each =='leftroles': diffs=get_diff_from_dict(ver_new_nbh_dict,ver_old_nbh_dict,each) compare_dict['leftroles']=dmp.diff_prettyHtml(diffs) elif each =='ats': diffs=get_diff_from_dict(ver_new_nbh_dict,ver_old_nbh_dict,each) compare_dict['ats']=dmp.diff_prettyHtml(diffs) elif each =='rightroles': diffs=get_diff_from_dict(ver_new_nbh_dict,ver_old_nbh_dict,each) compare_dict['rightroles']=dmp.diff_prettyHtml(diffs) elif each =='attributes': compare_rel_new={} compare_rel_old={} compare={} for rkey,rvalue in ver_new_nbh_dict[each].items(): ver_new="" for relvalue in rvalue: ver_new+=str(relvalue) + "," ver_new=ver_new[0:-1] compare_rel_new[str(rkey)]=ver_new for rkey,rvalue in ver_old_nbh_dict[each].items(): ver_old="" for rv in rvalue: ver_old+=str(rv) + "," ver_old=ver_old[0:-1] compare_rel_old[str(rkey)]=ver_old if len(compare_rel_new) >= len(compare_rel_old): for rkey,rvalue in compare_rel_new.items(): if compare_rel_old.has_key(rkey): diffs=dmp.diff_main(compare_rel_new[str(rkey)],compare_rel_old[str(rkey)]) compare[str(rkey)]=dmp.diff_prettyHtml(diffs) else: diffs=dmp.diff_main(compare_rel_new[str(rkey)],"") compare[str(rkey)]=dmp.diff_prettyHtml(diffs) else: for rkey,rvalue in compare_rel_old.items(): if compare_rel_new.has_key(rkey): diffs=dmp.diff_main(compare_rel_new[str(rkey)],compare_rel_old[str(rkey)]) compare[str(rkey)]=dmp.diff_prettyHtml(diffs) else: diffs=dmp.diff_main("",compare_rel_old[str(rkey)]) compare[str(rkey)]=dmp.diff_prettyHtml(diffs) compare_dict['attributes']=compare elif each =='relations': ver_new="" ver_old="" compare_rel_new={} compare_rel_old={} compare={} for rkey,rvalue in ver_new_nbh_dict[each].items(): ver_new="" for relk,relvalue in rvalue.items(): ver_new+=str(relk) + "," ver_new=ver_new[0:-1] compare_rel_new[str(rkey)]=ver_new for rkey,rvalue in ver_old_nbh_dict[each].items(): ver_old="" for relk,relvalue in rvalue.items(): ver_old+=str(relk) + "," ver_old=ver_old[0:-1] compare_rel_old[str(rkey)]=ver_old if len(compare_rel_new) >= len(compare_rel_old): for rkey,rvalue in compare_rel_new.items(): if compare_rel_old.has_key(rkey): diffs=dmp.diff_main(compare_rel_new[str(rkey)],compare_rel_old[str(rkey)]) compare[str(rkey)]=dmp.diff_prettyHtml(diffs) else: diffs=dmp.diff_main(compare_rel_new[str(rkey)],"") compare[str(rkey)]=dmp.diff_prettyHtml(diffs) else: for rkey,rvalue in compare_rel_old.items(): if compare_rel_new.has_key(rkey): diffs=dmp.diff_main(compare_rel_new[str(rkey)],compare_rel_old[str(rkey)]) compare[str(rkey)]=dmp.diff_prettyHtml(diffs) else: diffs=dmp.diff_main("",compare_rel_old[str(rkey)]) compare[str(rkey)]=dmp.diff_prettyHtml(diffs) compare_dict['relations']=compare elif each =='priornodes': diffs=get_diff_from_dict(ver_new_nbh_dict,ver_old_nbh_dict,each) compare_dict['priornodes']=dmp.diff_prettyHtml(diffs) elif each =='posteriornodes': diffs=get_diff_from_dict(ver_new_nbh_dict,ver_old_nbh_dict,each) compare_dict['posteriornodes']=dmp.diff_prettyHtml(diffs) elif each =='type_of': diffs=get_diff_from_dict(ver_new_nbh_dict,ver_old_nbh_dict,each) compare_dict['type_of']=dmp.diff_prettyHtml(diffs) elif each =='contains_subtypes': diffs=get_diff_from_dict(ver_new_nbh_dict,ver_old_nbh_dict,each) compare_dict['contains_subtypes']=dmp.diff_prettyHtml(diffs) elif each =='member_of_metatypes': diffs=get_diff_from_dict(ver_new_nbh_dict,ver_old_nbh_dict,each) compare_dict['member_of_metatypes']=dmp.diff_prettyHtml(diffs) ver_new="" ver_old="" ver_new+=ver_new_dict['content'] ver_old+=ver_old_dict['content'] diffs = dmp.diff_main(ver_new, ver_old) compare_dict['content']=dmp.diff_prettyHtml(diffs) ver_new_nbh_dict['content']=ver_new_dict['content'] ver_old_nbh_dict['content']=ver_old_dict['content'] variables=RequestContext(request,{'nt':ot,'ver_old_dict':ver_old_dict,'ver_new_dict':ver_new_dict,'compare_dict':compare_dict ,'ssid1':ssid1,'ssid2':ssid2,'version_no1':version_no1,'version_no2':version_no2,'ver_new_nbh_dict':ver_new_nbh_dict,'ver_old_nbh_dict':ver_old_nbh_dict}) template="gstudio/version_diff.html" return render_to_response(template,variables) def set_objecttype_field(obj,ver_merge): # setting the objecttypes fields obj.slug = ver_merge['slug'] obj.altnames=ver_merge['altnames'] obj.rght = ver_merge['rght'] obj.nodemodel = ver_merge['nodemodel'] obj.lft = ver_merge['lft'] obj.comment_enabled = ver_merge['comment_enabled'] obj.title = ver_merge['title'] obj.sites = ver_merge['sites'] obj.content = ver_merge['content'] obj.template = ver_merge['template'] obj.tree_id = ver_merge['tree_id'] obj.plural = ver_merge['plural'] obj.status = ver_merge['status'] obj.nid_ptr = NID.objects.get(id=ver_merge['nid_ptr']) # obj.nbh=ver_merge['nbh'] obj.id = ver_merge['id'] obj.pingback_enabled = ver_merge['pingback_enabled'] return obj def set_attributetype_field(obj,ver_merge): # setting the objecttypes fields obj.subjecttype = NID.objects.get(id=ver_merge['nid_ptr']) obj.applicable_nodetypes=ver_merge['applicable_nodetypes'] obj.dataType = ver_merge['dataType'] obj.verbose_name = ver_merge['verbose_name'] obj.null = ver_merge['null'] obj.blank = ver_merge['blank'] obj.help_text = ver_merge['help_text'] # obj.max_digits = ver_merge['max_digits'] # obj.decimal_places = ver_merge['decimal_places'] obj.auto_now = ver_merge['auto_now'] obj.auto_now_add = ver_merge['auto_now_add'] obj.upload_to = ver_merge['upload_to'] obj.path = ver_merge['path'] obj.verify_exists = ver_merge['verify_exists'] # obj.min_length= ver_merge['min_length'] obj.required= ver_merge['required'] obj.label = ver_merge['label'] obj.unique = ver_merge['unique'] # obj.validators= ver_merge['validators'] obj.default= ver_merge['default'] obj.editable= ver_merge['editable'] # return HttpResponse(ver_merge) return obj def set_relationtype_field(obj,ver_merge): # setting the relationtype types fields obj.inverse = ver_merge['inverse'] obj.left_subjecttype=ver_merge['left_subjecttype'] obj.left_applicable_nodetypes= ver_merge['left_applicable_nodetypes'] obj.left_cardinality = ver_merge['left_cardinality'] obj.right_subjecttype= ver_merge['right_subjecttype'] obj.right_cadinality= ver_merge['right_cadinality'] obj.right_cadinality= ver_merge['right_cadinality'] obj.is_symmetrical= ver_merge['is_symmetrical'] obj.is_reflexive= ver_merge['is_reflexive'] obj.is_transitive= ver_merge['is_transitive'] return obj def set_processtype_field(obj,ver_merge): # setting the processtype types fields obj.changing_attributetype_set = ver_merge[''] obj.changing_relationtype_set=ver_merge[''] return obj def set_systemtype_field(obj,ver_merge): # setting the systemtype types fields obj.nodetype_set = ver_merge['nodetype_set'] obj.relationtype_set=ver_merge['relationtype_set'] obj.attributetype_set= ver_merge['attributetype_set'] obj.metatype_set = ver_merge['metatype_set'] obj.processtype_set= ver_merge['processtype_set'] return obj def get_merge_dict(ssid1,ssid2,direction): ver_merge={} ot=Version.objects.get(id=ssid1) obj=ot.object.ref ver_left_dict=obj.version_info(ssid1) ver_right_dict=obj.version_info(ssid2) if direction =='right': # swap left and right temp_dict={} temp_dict=ver_left_dict ver_left_dict=ver_right_dict ver_right_dict=temp_dict # swap ssid1 and ssid2 for managing nbhood history temp=int(ssid1) ssid1=int(ssid2) ssid2=temp ver_left_nbh_dict=ast.literal_eval(ver_left_dict['nbhood']) ver_right_nbh_dict=ast.literal_eval(ver_right_dict['nbhood']) # By default value of content is removed if ver_left_dict['content']=='
': ver_left_dict['content']='' if ver_right_dict['content']=='
': ver_right_dict['content']='' # Getting merged dictionary for each in ver_left_dict: if ver_left_dict[each] and ver_right_dict[each]: ver_merge[each]=ver_right_dict[each] elif ver_left_dict[each]: if not ver_right_dict[each]: ver_merge[each]=ver_left_dict[each] elif ver_right_dict[each]: if not ver_left_dict[each]: ver_merge[each]=ver_right_dict[each] else: if not ver_left_dict[each]: if not ver_right_dict[each]: ver_merge[each]=ver_right_dict[each] ver_merge_nbh_dict={} # processing nbhood for merged version for each in ver_left_nbh_dict: if isinstance(ver_left_nbh_dict[each],dict): if ver_left_nbh_dict[each] and ver_right_nbh_dict[each]: ver_merge_nbh_dict[each]=dict(ver_left_nbh_dict[each].items()+ver_right_nbh_dict[each].items()) elif ver_left_nbh_dict[each]: if not ver_right_nbh_dict[each]: ver_merge_nbh_dict[each]=ver_left_nbh_dict[each] elif ver_right_nbh_dict[each]: if not ver_left_nbh_dict[each]: ver_merge_nbh_dict[each]=ver_right_nbh_dict[each] else: if not ver_left_nbh_dict[each]: if not ver_right_nbh_dict[each]: ver_merge_nbh_dict[each]=ver_right_nbh_dict[each] else: if ver_left_nbh_dict[each] and ver_right_nbh_dict[each]: ver_merge_nbh_dict[each]=ver_right_nbh_dict[each] elif ver_left_nbh_dict[each]: if not ver_right_nbh_dict[each]: ver_merge_nbh_dict[each]=ver_left_nbh_dict[each] elif ver_right_nbh_dict[each]: if not ver_left_nbh_dict[each]: ver_merge_nbh_dict[each]=ver_right_nbh_dict[each] else: if not ver_left_nbh_dict[each]: if not ver_right_nbh_dict[each]: ver_merge_nbh_dict[each]=ver_right_nbh_dict[each] # Removing auto generated fields del(ver_merge['start_publication']) del(ver_merge['end_publication']) del(ver_merge['creation_date']) del(ver_merge['last_update']) history_left_list=[] history_right_list=[] history_merged_list=[] history_left_list=ver_left_nbh_dict['history'] history_left_list.append(ssid1) history_right_list=ver_right_nbh_dict['history'] history_right_list.append(ssid2) history_merged_list.append(history_left_list) history_merged_list.append(history_right_list) ver_merge_nbh_dict['history']=history_merged_list obj.nbhood = unicode(ver_merge_nbh_dict) if isinstance(obj,Objecttype): obj=set_objecttype_field(obj,ver_merge) if isinstance(obj,Attributetype): obj=set_objecttype_field(obj,ver_merge) obj=set_attributetype_field(obj,ver_merge) if isinstance(obj,Relationtype): obj=set_objecttype_field(obj,ver_merge) obj=set_relationtype_field(obj,ver_merge) if isinstance(obj,Processtype): obj=set_objecttype_field(obj,ver_merge) obj=set_processtype_field(obj,ver_merge) if isinstance(obj,Systemtype): obj=set_objecttype_field(obj,ver_merge) obj=set_systemtype_field(obj,ver_merge) obj.save_revert_or_merge() content=ver_merge['content'] content=content[3:-4] ver_merge['content']= content return ver_merge def merge_version(request,ssid1,ssid2): direction="" ver_merge={} for each in request.GET: direction=each ot=Version.objects.get(id=ssid1) obj=ot.object.ref ver_merge=get_merge_dict(ssid1,ssid2,direction) slist=[] slist=obj.get_ssid version_counter=len(slist) merged_ver_ssid=slist[version_counter-1] ver_merged_dict=obj.version_info(merged_ver_ssid) ver_merged_nbh_dict=ast.literal_eval(ver_merged_dict['nbhood']) ver_merged_nbh_dict['content']=ver_merge['content'] variables = RequestContext(request,{'ver_nbh_dict':ver_merged_nbh_dict ,'nt':obj,'ssid':merged_ver_ssid,'version_no':version_counter}) template="gstudio/display.html" return render_to_response(template,variables) def revert(ssid): ver_revert={} ot=Version.objects.get(id=ssid) obj=ot.object.ref ver_revert=obj.version_info(ssid) # Removing auto generated fields del(ver_revert['start_publication']) del(ver_revert['end_publication']) del(ver_revert['creation_date']) del(ver_revert['last_update']) history=[] ver_revert_nbh_dict=ast.literal_eval(ver_revert['nbhood']) history=ver_revert_nbh_dict['history'] history.append(ssid) ver_revert_nbh_dict['history']=history # ver_revert_nbh_dict['history']=ver_revert_nbh_history.append(ssid) ver_revert['nbhood']=unicode(ver_revert_nbh_dict) obj.nbhood=ver_revert['nbhood'] if isinstance(obj,Objecttype): obj=set_objecttype_field(obj,ver_revert) if isinstance(obj,Attributetype): obj=set_objecttype_field(obj,ver_revert) obj=set_attributetype_field(obj,ver_revert) if isinstance(obj,Relationtype): obj=set_objecttype_field(obj,ver_revert) obj=set_relationtype_field(obj,ver_revert) if isinstance(obj,Processtype): obj=set_objecttype_field(obj,ver_revert) obj=set_processtype_field(obj,ver_revert) if isinstance(obj,Systemtype): obj=set_objecttype_field(obj,ver_revert) obj=set_systemtype_field(obj,ver_revert) obj.save_revert_or_merge() # formatting content field content=ver_revert['content'] content=content[3:-4] ver_revert['content']= content return ver_revert def revert_version(request): ver_revert={} for each in request.GET: ssid=each ssid=int(ssid) ot=Version.objects.get(id=ssid) obj=ot.object.ref ver_revert=revert(ssid) ver_revert['nbhood'] slist=[] slist=obj.get_ssid version_counter=len(slist) revert_ver_ssid=slist[version_counter-1] ver_revert_dict=obj.version_info(revert_ver_ssid) ver_revert_nbh_dict=ast.literal_eval(ver_revert_dict['nbhood']) ver_revert_nbh_dict['content']=ver_revert['content'] variables = RequestContext(request,{'ver_nbh_dict':ver_revert_nbh_dict ,'nt':obj,'ssid':revert_ver_ssid,'version_no':version_counter}) template="gstudio/display.html" return render_to_response(template,variables) # return HttpResponse(ver_revert['nbhood'])