mirror of
https://github.com/ankitects/anki.git
synced 2025-12-17 00:30:58 -05:00
add model copy support
This commit is contained in:
parent
8e71b5fbbf
commit
93332079b5
4 changed files with 42 additions and 1 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
14
anki/deck.py
14
anki/deck.py
|
|
@ -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
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue