def load_data_as_xml(data_dump_as_xml): tree = etree.parse(data_dump_as_xml) docinfo = tree.docinfo if docinfo.encoding != "UTF-8": raise XMLDataDumpException("Not supported encoding: %s" % docinfo.encoding) root = tree.getroot() if root.tag != "data": raise XMLDataDumpException("%s: %s != 'data'" % (root.sourceline, root.tag)) for shelf_xml in root: if shelf_xml.tag != "shelf": raise XMLDataDumpException("%s: %s != 'shelf'" % (shelf_xml.sourceline, shelf_xml.tag)) shelf = Shelf() shelf.name = shelf_xml.get("name") try: shelf.save() except IntegrityError as e: raise XMLDataDumpException("%s: cannot add shelf: %s" % (shelf_xml.sourceline, str(e))) for deck_data in shelf_xml: if deck_data.tag != "deck": raise XMLDataDumpException( "%s: %s != 'deck'" % (deck_data.sourceline, deck_data.tag)) deck = Deck() deck.shelf = shelf deck.name = deck_data.get("name") deck.save() for card_data in deck_data: if card_data.tag != "card": raise XMLDataDumpException( "%s: %s != 'card'" % (card_data.sourceline, card_data.tag)) if card_data[0].tag != "question": raise XMLDataDumpException( "%s: %s != 'question'" % (card_data[0].sourceline, card_data[0].tag)) if card_data[1].tag != "answer": raise XMLDataDumpException( "%s: s%s != 'answer'" % (card_data[1].sourceline, card_data[1].tag)) card = Card() card.deck = deck card.question = card_data[0].text card.answer = card_data[1].text card.save()
def add_edit_card(request, deck_id=None, card_id=None): if card_id: card = get_object_or_404(Card, pk=card_id) else: card = Card() if request.method == "GET": card_form = CardForm(instance=card) elif request.method == "POST": if deck_id is None: deck_id = card.deck.id card_form = CardForm(data=request.POST, instance=card, deck_id=deck_id) if card_form.is_valid(): card = card_form.save(commit=False) if not hasattr(card, "deck"): # Card is added. deck = get_object_or_404(Deck, pk=deck_id) card.deck = deck card.save() # If new card is added then we need also to add it # to train pools so user can train it also from now. trainpools = TrainPool.objects.filter(deck=deck) for train_pool in trainpools: train_card = TrainCard(card=card) train_card.save() train_pool.train_cards.add(train_card) train_pool.save() return redirect(request.path) else: # Card is edited. card.save() return redirect(reverse("pamietacz.views.show_deck", args=(deck_id,))) return render(request, "add_edit_card.html", {"card_form": card_form, "action": request.get_full_path()})
def add_edit_card(request, deck_id=None, card_id=None): if card_id: card = get_object_or_404(Card, pk=card_id) else: card = Card() if request.method == "GET": card_form = CardForm(instance=card) elif request.method == "POST": if deck_id is None: deck_id = card.deck.id card_form = CardForm(data=request.POST, instance=card, deck_id=deck_id) if card_form.is_valid(): card = card_form.save(commit=False) if not hasattr(card, "deck"): # Card is added. deck = get_object_or_404(Deck, pk=deck_id) card.deck = deck card.save() # If new card is added then we need also to add it # to train pools so user can train it also from now. trainpools = TrainPool.objects.filter(deck=deck) for train_pool in trainpools: train_card = TrainCard(card=card) train_card.save() train_pool.train_cards.add(train_card) train_pool.save() return redirect(request.path) else: # Card is edited. card.save() return redirect( reverse("pamietacz.views.show_deck", args=(deck_id, ))) return render(request, "add_edit_card.html", { "card_form": card_form, "action": request.get_full_path() })