add model copy support

This commit is contained in:
Damien Elmes 2009-01-14 15:28:27 +09:00
parent 8e71b5fbbf
commit 93332079b5
4 changed files with 42 additions and 1 deletions

View file

@ -29,7 +29,7 @@ from sqlalchemy import (Table, Integer, Float, Column, MetaData,
UniqueConstraint, Index, PrimaryKeyConstraint) UniqueConstraint, Index, PrimaryKeyConstraint)
from sqlalchemy import create_engine from sqlalchemy import create_engine
from sqlalchemy.orm import mapper, sessionmaker as _sessionmaker, relation, backref, \ 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.sql import select, text, and_
from sqlalchemy.exceptions import DBAPIError, OperationalError from sqlalchemy.exceptions import DBAPIError, OperationalError
import sqlalchemy import sqlalchemy

View file

@ -1104,6 +1104,20 @@ answerAlign from cardModels""")])
self.css = css self.css = css
return 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 # Fields
########################################################################## ##########################################################################

View file

@ -58,6 +58,13 @@ class FieldModel(object):
self.unique = unique self.unique = unique
self.id = genID() 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) mapper(FieldModel, fieldModelsTable)
# Card models # Card models
@ -108,6 +115,13 @@ class CardModel(object):
self.active = active self.active = active
self.id = genID() 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) mapper(CardModel, cardModelsTable)
def formatQA(cid, mid, fact, tags, cm): def formatQA(cid, mid, fact, tags, cm):

View file

@ -135,6 +135,19 @@ def test_modelAddDelete():
assert deck.cardCount == 0 assert deck.cardCount == 0
deck.s.refresh(deck) 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(): def test_media():
deck = DeckStorage.Deck() deck = DeckStorage.Deck()
# create a media dir # create a media dir