示例#1
0
def import_bibtex_js(request):
    response = {}
    status = 405
    if request.is_ajax() and request.method == 'POST':
        from bibliography.bib import Persons
        from bibliography.bib import BibDate
        response['errors'] = []
        response['warning'] = []
        bibs = json.loads(request.POST['bibs'])
        status = 200
        e_types = {}
        for e_type in EntryType.objects.all():
            e_types[e_type.type_name] = e_type
        e_types_alias = {}
        for e_type in EntryTypeAlias.objects.all():
            e_types_alias[e_type.type_name] = e_type
        e_fields = {}
        for e_field in EntryField.objects.all():
            e_fields[e_field.field_name] = e_field
        e_fields_alias = {}
        for e_field in EntryFieldAlias.objects.all():
            e_fields_alias[e_field.field_name] = e_field
        new_bibs = []
        response['bib_ids'] = []
        for bib_key in bibs:
            bib = bibs[bib_key]
            bib_type_name = bib['bibtype']
            #the entry type must exists
            try:
                the_type = e_types[bib_type_name]
            except KeyError:
                try:
                    type_alias = e_types_alias[bib_type_name]
                    the_type = type_alias.type_alias
                except KeyError:
                    the_type = e_types['misc']
                    response['warning'].append(
                        bib_key +
                        ' is saved as misc. Fidus Writer does not support "' +
                        bib_type_name + '"')
            inserting_obj = {
                'entry_key': bib_key,
                'entry_owner': request.user,
                'entry_type': the_type
            }
            the_fields = {}
            #save the posted values
            for key, val in bib.iteritems():
                if key in ['bibtype', 'year', 'month']:
                    #do not save the value of type, year and month
                    continue
                else:
                    try:
                        field_type = e_fields[key]
                    except KeyError:
                        try:
                            field_alias = e_fields_alias[key]
                            field_type = field_alias.field_alias
                        except KeyError:
                            response['errors'].append(
                                key + ' of ' + bib_key +
                                ' could not be saved. Fidus Writer does not support the field.'
                            )
                            continue
                    if 'l_name' == field_type.field_type:
                        #restore name list value like "author"
                        persons = Persons(val)
                        val = persons.get_names()
                    elif 'f_date' == field_type.field_type:
                        #restore date value like "date"
                        bib_date = BibDate(val)
                        val = bib_date.date
                    if isinstance(val, basestring):
                        val = val.strip("{}")
                    if isinstance(val, list):
                        val = ' and '.join(val)
                    the_fields[field_type.field_name] = val
            inserting_obj['fields'] = json.dumps(the_fields)
            the_entry = save_bib_to_db(inserting_obj)
            if the_entry != False:
                new_bibs.append(the_entry)
                response['bib_ids'].append(the_entry.id)
            response['bibs'] = serializer.serialize(
                new_bibs,
                fields=('entry_key', 'entry_owner', 'entry_type', 'entry_cat',
                        'fields'))
    return HttpResponse(json.dumps(response),
                        content_type='application/json; charset=utf8',
                        status=status)