From 93332079b534946afe0cbfcc20730dd1240649da Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Wed, 14 Jan 2009 15:28:27 +0900 Subject: [PATCH] add model copy support --- anki/db.py | 2 +- anki/deck.py | 14 ++++++++++++++ anki/models.py | 14 ++++++++++++++ tests/test_deck.py | 13 +++++++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/anki/db.py b/anki/db.py index 2ab7bf131..9052ff8f6 100644 --- a/anki/db.py +++ b/anki/db.py @@ -29,7 +29,7 @@ from sqlalchemy import (Table, Integer, Float, Column, MetaData, UniqueConstraint, Index, PrimaryKeyConstraint) from sqlalchemy import create_engine from sqlalchemy.orm import mapper, sessionmaker as _sessionmaker, relation, backref, \ - object_session as _object_session + object_session as _object_session, class_mapper from sqlalchemy.sql import select, text, and_ from sqlalchemy.exceptions import DBAPIError, OperationalError import sqlalchemy diff --git a/anki/deck.py b/anki/deck.py index 326fb7844..300fbede8 100644 --- a/anki/deck.py +++ b/anki/deck.py @@ -1104,6 +1104,20 @@ answerAlign from cardModels""")]) self.css = css return css + def copyModel(self, oldModel): + "Add a new model to DB based on MODEL." + m = Model(_("%s copy") % oldModel.name) + for f in oldModel.fieldModels: + f = f.copy() + m.addFieldModel(f) + for c in oldModel.cardModels: + c = c.copy() + m.addCardModel(c) + for attr in ("tags", "spacing", "initialSpacing"): + setattr(m, attr, getattr(oldModel, attr)) + self.addModel(m) + return m + # Fields ########################################################################## diff --git a/anki/models.py b/anki/models.py index 982536a44..afd14fff8 100644 --- a/anki/models.py +++ b/anki/models.py @@ -58,6 +58,13 @@ class FieldModel(object): self.unique = unique self.id = genID() + def copy(self): + new = FieldModel() + for p in class_mapper(FieldModel).iterate_properties: + setattr(new, p.key, getattr(self, p.key)) + new.id = genID() + return new + mapper(FieldModel, fieldModelsTable) # Card models @@ -108,6 +115,13 @@ class CardModel(object): self.active = active self.id = genID() + def copy(self): + new = CardModel() + for p in class_mapper(CardModel).iterate_properties: + setattr(new, p.key, getattr(self, p.key)) + new.id = genID() + return new + mapper(CardModel, cardModelsTable) def formatQA(cid, mid, fact, tags, cm): diff --git a/tests/test_deck.py b/tests/test_deck.py index ecafcba36..9b714924b 100644 --- a/tests/test_deck.py +++ b/tests/test_deck.py @@ -135,6 +135,19 @@ def test_modelAddDelete(): assert deck.cardCount == 0 deck.s.refresh(deck) +def test_modelCopy(): + deck = DeckStorage.Deck() + m = JapaneseModel() + deck.addModel(m) + f = deck.newFact() + f['Expression'] = u'1' + deck.addFact(f) + m2 = deck.copyModel(m) + assert m2.name == "Japanese copy" + assert m2.id != m.id + assert m2.fieldModels[0].id != m.fieldModels[0].id + assert m2.cardModels[0].id != m.cardModels[0].id + def test_media(): deck = DeckStorage.Deck() # create a media dir