Example #1
0
    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 = (
            '&nbsp;<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)
Example #2
0
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')