コード例 #1
0
ファイル: doc_funcs.py プロジェクト: WiReSEP/WireLib2012
def insert_doc(dict_insert, user):
    """Fügt ein Dokument aus einem dict in die Datenbank ein, nachdem es auf
    Validität überprüft wurde.
    """
    from documents.models import Category
    from documents.models import DocExtra
    from documents.models import Document
    from documents.models import Keywords
    from documents.models import Publisher
    valid, message = is_valid(dict_insert)
    if not valid:
        raise ValueError(message)
    # .get wird verwendet für erlaubt fehlende Einträge
    try:
        bib_no = dict_insert[u"bib_no"]
        inv_no = dict_insert[u"inv_no"]
        bibtex_id = dict_insert[u"bibtex_id"]
        lib_of_con_nr = dict_insert.get(u"lib_of_con_nr", None)
        title = dict_insert[u"title"]
        isbn = dict_insert.get(u"isbn", None)
        category = dict_insert[u"category"]
        publisher = dict_insert.get(u"publisher", None)
        year = dict_insert.get(u"year", None)
        address = dict_insert.get(u"address", None)
        price = dict_insert.get(u"price", None)
        currency = dict_insert.get(u"currency", None)
        date_of_purchase = dict_insert.get(u"date_of_purchase",
                                           datetime.date.today())
        ub_date = None
        comment = dict_insert.get(u"comment", None)
        authors = dict_insert.get(u"author", [])
        editors = dict_insert.get(u"editor", [])
        keywords = dict_insert.get(u"keywords", [])
        extra_fields = dict_insert.get(u"extras", {})
        last_updated = datetime.date.today()
        last_edit_by = user
    except KeyError as e:
        message = u"Daten haben nicht die benötigten Felder: %s" % e.message
        raise ValueError(message)
    try:
        # Erstellung des Dokumentes in der Datenbank, ebenso zugehörende
        # Elemente: author, publisher, editor, keywords...
        publisher_db, dummy = Publisher.objects.get_or_create(name=publisher)
        try:
            category_db = Category.objects.get(name=category)
        except Category.DoesNotExist:
            raise UnknownCategoryError(category)
        document_db = Document(bib_no=bib_no, inv_no=inv_no,
                               bibtex_id=bibtex_id, lib_of_con_nr=lib_of_con_nr,
                               title=title, isbn=isbn, category=category_db,
                               publisher=publisher_db, year=year, price=price,
                               currency=currency, address=address,
                               date_of_purchase=date_of_purchase,
                               ub_date=ub_date, comment=comment,
                               last_updated=last_updated,
                               last_edit_by=last_edit_by,
                               )
        document_db.save(user)
        document_db.set_status(user, Document.AVAILABLE)
        for author in authors:
            author_db = extract_author(author)
            document_db.add_author(author_db)
            document_db.save(user)

        for editor in editors:
            editor_db = extract_author(editor)
            document_db.add_editor(editor_db)
            document_db.save(user)
        keywords_db = []

        for key in keywords:
            if key == '' or key is None:
                continue
            key_db, dummy = Keywords.objects.get_or_create(
                document=document_db,
                keyword=key)
            if dummy:
                keywords_db.append(key_db)
        extras_db = []
        for extra in extra_fields:
            value = extra_fields[extra]
            if value != "":
                extra_db, dummy = DocExtra.objects.get_or_create(
                    doc_id=document_db, bib_field=extra, content=value)
                if dummy:
                    extras_db.append(extra_db)
    except IntegrityError as e:
        print 'IntegrityError:', e
        raise DuplicateKeyError(e.message)  # TODO regex basteln für Feld