def render(self, name, value, attrs=None): def wrap_control_group(key, val, field, classes=[]): attrs = {} attrs["class"] = " ".join(classes + ["zotero-entry", "control-group"]) attrs["data-zotero-key"] = key control_html = ( "<div %s>" % flatatt(attrs) + '<label class="control-label">%s</label>' % val + '<div class="controls">' + field + "</div>" + "</div>" ) return mark_safe(control_html) html = u'<div class="zotero-information-edit">' ITEM_TYPES = "".join( ['<option value="%s">%s</option>' % (key, val) for key, val in type_map["readable"].items()] ) ITEM_TYPE_SELECT = '<select name="item-type-select">' + '<option value=""></option>' + ITEM_TYPES + "</select>" CREATOR_ADD_REMOVE = ( ' <i class="add-creator icon-plus-sign"></i>' + '<i class="remove-creator icon-minus-sign"></i>' ) if not value: html += ( '<div id="item-type-select-dialog" class="control-group">' + '<label class="control-label">Item Type</label>' + '<div class="controls">%s</div>' % ITEM_TYPE_SELECT ) return mark_safe(html) data = json.loads(force_unicode(value), object_pairs_hook=OrderedDict) key_counter = 0 for key, val in data.items(): input_attrs = {"name": "zotero-key-%02d-%s" % (key_counter, key)} if key == "itemType": input_attrs["type"] = "hidden" input_attrs["value"] = val field = "<label><strong>%s</strong></label>" % type_map["readable"][val] + "<input %s />" % flatatt( input_attrs ) html += wrap_control_group("itemType", "Item type", field) elif key == "creators": # Parse array of different creator objects which have the property # 'creatorType' as well as 1) name or 2) firstName and lastName creators = val input_attrs["type"] = "hidden" try: creator_types = json.loads(get_creator_types(data["itemType"])) except: creator_types = [] if not creators: continue for creator in creators: # Value to be posted is a json string inside a hidden # input. If a creator is edited, this input must be updated # with javascript. field = "" ctype = creator["creatorType"] creator_type_options = "\n".join( [ '<option %svalue="%s">%s</option>' % ( 'selected="selected"' if c["creatorType"] == ctype else "", c["creatorType"], c["localized"], ) for c in creator_types ] ) creator_type_options = creator_type_options or '<option value="%s">%s</option>' % ( ctype, contrib_map["readable"][ctype], ) creator_select = ( '<select data-creator-key="creatorType" class="creator-select creator-attr">' + creator_type_options + "</select>" ) input_attrs["value"] = json.dumps(creator) field += "<input%s>" % flatatt(input_attrs) if creator.get("name"): field += "<textarea%s>%s</textarea>" % ( flatatt({"class": "creator-attr", "data-creator-key": "name"}), creator["name"], ) else: field += "<textarea%s>%s</textarea>" % ( flatatt({"class": "creator-attr", "data-creator-key": "lastName"}), creator["lastName"], ) field += ", " field += "<textarea%s>%s</textarea>" % ( flatatt({"class": "creator-attr", "data-creator-key": "firstName"}), creator["firstName"], ) field += CREATOR_ADD_REMOVE html += wrap_control_group("creators", creator_select, field, classes=["zotero-creator"]) elif key == "tags": continue tags = val itemAttrs["type"] = "hidden" if not tags: itemAttrs["value"] = "[]" item += "<input%s>" % flatatt(itemAttrs) for tag in tags: # Like the creator field, this must also be updated with # javascript. itemAttrs["value"] = json.dumps(tag) item += "<input%s>" % flatatt(itemAttrs) elif isinstance(val, basestring): if field_help.has_key(key): input_attrs["placeholder"] = field_help[key] field = "<textarea%s>%s</textarea>" % (flatatt(input_attrs), val) html += wrap_control_group(key, field_map["readable"][key], field) key_counter += 1 html += ( '<div class="control-group zotero-entry-delete">' + '<label class="control-label">Delete metadata?</label>' + '<div class="controls">' + '<input type="checkbox" name="zotero-data-DELETE" value="DELETE" />' + "</div></div>" ) html += "</div>" return mark_safe(html)
def get_creator_types(request): if not request.is_ajax() or not request.GET.get('itemType', False): return HttpResponseBadRequest() item_type = request.GET.get('itemType') creators_json = utils.get_creator_types(item_type) return HttpResponse(creators_json, mimetype='application/json')