~kevang/mnemosyne-proj/grade-shortcuts-improvements

« back to all changes in this revision

Viewing changes to mnemosyne/mnemosyne/libmnemosyne/card_types/simple_card.py

  • Committer: pbienst
  • Date: 2008-08-04 16:13:00 UTC
  • Revision ID: svn-v3-trunk0:e5e6b78b-db40-0410-9517-b98c64f8d2c1:trunk:497
Progress dump.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
##############################################################################
2
2
#
3
 
# Two sided card type <Peter.Bienstman@UGent.be>
 
3
# simple_card.py <Peter.Bienstman@UGent.be>
4
4
#
5
5
##############################################################################
6
6
 
7
7
import gettext
8
8
_ = gettext.gettext
9
9
 
10
 
from mnemosyne.libmnemosyne.card import Card
11
10
from mnemosyne.libmnemosyne.card_type import CardType
12
 
from mnemosyne.libmnemosyne.fact import Fact
13
 
from mnemosyne.libmnemosyne.config import config
14
 
 
15
 
 
16
 
 
17
 
##############################################################################
18
 
#
19
 
# TwoSided
20
 
#
21
 
#  q: question
22
 
#  a: answer
23
 
#
24
 
##############################################################################
25
 
 
26
 
class TwoSided(CardType):
 
11
from mnemosyne.libmnemosyne.fact_view import FactView
 
12
 
 
13
 
 
14
 
 
15
##############################################################################
 
16
#
 
17
# Simple
 
18
#
 
19
##############################################################################
 
20
 
 
21
class Simple(CardType):
27
22
 
28
23
    ##########################################################################
29
24
    #
31
26
    #
32
27
    ##########################################################################
33
28
 
34
 
    front_to_back = 0
35
 
    back_to_front = 1
36
 
 
37
29
    def __init__(self):
38
30
 
39
 
        # Front to back
40
 
 
41
 
        v = FactView(_("Front to back"))
42
 
 
43
 
        v.q_fields.append("q", _("Question"), True
44
 
 
45
 
        self.fact_views.append
46
 
        
47
 
        CardType.__init__(self, id=1,
48
 
                          name=_("Regular card"),
49
 
                          can_be_unregistered=False)
50
 
 
51
 
 
52
 
 
53
 
    ##########################################################################
54
 
    #
55
 
    # generate_q
56
 
    #
57
 
    ##########################################################################
58
 
 
59
 
    def generate_q(self, fact, fact_view):
60
 
 
61
 
        if fact_view == TwoSided.front_to_back:
62
 
            return fact['q']
63
 
        elif fact_view == TwoSided.back_to_front:
64
 
            return fact['a']
65
 
        else:
66
 
            print 'Invalid subtype.'
67
 
            raise NameError
68
 
 
69
 
 
70
 
        
71
 
    ##########################################################################
72
 
    #
73
 
    # generate_a
74
 
    #
75
 
    ##########################################################################
76
 
 
77
 
    def generate_a(self, fact, fact_view):
78
 
 
79
 
        if fact_view == TwoSided.front_to_back:
80
 
            return fact['a']
81
 
        elif fact_view == TwoSided.back_to_front:
82
 
            return fact['q']
83
 
        else:
84
 
            print 'Invalid fact_view.'
85
 
            raise NameError
86
 
 
87
 
        
88
 
 
89
 
    ##########################################################################
90
 
    #
91
 
    # new_cards
92
 
    #
93
 
    ##########################################################################
94
 
 
95
 
    def new_cards(self, data):
96
 
 
97
 
        # Extract and remove data.
98
 
 
99
 
        grade          = data['grade']
100
 
        cat_names      = data['cat_names']
101
 
        add_vice_versa = data['add_vice_versa']
102
 
        
103
 
        del data['add_vice_versa']
104
 
        del data['grade']
105
 
 
106
 
        # Create fact.
107
 
 
108
 
        # TODO: add subtypes as a category?
109
 
 
110
 
        fact = Fact(data)
111
 
        fact.save()
112
 
 
113
 
        card = Card(grade=grade, card_type=self, fact=fact,
114
 
                    fact_view=TwoSided.front_to_back, cat_names=cat_names)
115
 
        card.save()
116
 
 
117
 
        if add_vice_versa:
118
 
            card_2 = Card(grade=grade, card_type=self, fact=fact,
119
 
                 fact_view=TwoSided.back_to_front, cat_names=cat_names,
120
 
                 id=card.id+'.inv')
121
 
            card_2.save()
122
 
 
123
 
        # TODO: drop the .inv suffix?
124
 
 
125
 
        self.widget.clear()
126
 
 
127
 
        return
128
 
    
129
 
        # TODO: add duplicate checking.
130
 
        
131
 
        ## Old code:
132
 
 
133
 
        orig_added = self.check_duplicates_and_add(grade,q,a,cat_names)
134
 
        rev_added = None
135
 
 
136
 
        if orig_added and add_vice_versa:
137
 
            rev_added = self.check_duplicates_and_add(grade,a,q,\
138
 
                                               cat_names,orig_added.id+'.inv')
139
 
 
140
 
        if add_vice_versa and orig_added and not rev_added:
141
 
 
142
 
            # Swap question and answer.
143
 
 
144
 
            self.question.setText(a)
145
 
            self.answer.setText(q)
146
 
            self.addViceVersa.setChecked(False)
147
 
 
148
 
        elif orig_added:
149
 
 
150
 
            # Clear the form to make room for new question.
151
 
 
152
 
            self.question.setText("")
153
 
            self.answer.setText("")
154
 
 
155
 
 
156
 
 
157
 
    ##########################################################################
158
 
    #
159
 
    # check_duplicates_and_add
160
 
    #
161
 
    # TODO: check how this needs to be changed when there are multiple
162
 
    # categories possible. Probably replace category by card types then.
163
 
    #
164
 
    ##########################################################################
165
 
 
166
 
    def check_duplicates_and_add(self, grade, q, a, cat_names, id=None):
167
 
 
168
 
        if config["check_duplicates_when_adding"] == True:
169
 
 
170
 
            # Find duplicate questions and refuse to add if duplicate
171
 
            # answers are found as well.
172
 
 
173
 
            allow_dif_cat = config["allow_duplicates_in_diff_cat"]
174
 
 
175
 
            same_questions = []
176
 
 
177
 
            for card in get_cards():
178
 
                if card.q == q:
179
 
                    if card.a == a:
180
 
 
181
 
                        if card.cat.name == cat_name or not allow_dif_cat:
182
 
                            QMessageBox.information(None,
183
 
                                                    _("Mnemosyne"),
184
 
                                _("Card is already in database.\n")\
185
 
                                .append(_("Duplicate not added.")),
186
 
                                _("&OK"))
187
 
 
188
 
                            return None
189
 
 
190
 
                    elif card.cat.name == cat_name or not allow_dif_cat:
191
 
                        same_questions.append(card)
192
 
 
193
 
            # Make a list of already existing answers for this question
194
 
            # and merge if the user wishes so.
195
 
 
196
 
            if len(same_questions) != 0:
197
 
 
198
 
                answers = a
199
 
                for i in same_questions:
200
 
                    answers += ' / ' + i.a
201
 
 
202
 
                status = QMessageBox.question(None,
203
 
                   _("Mnemosyne"),
204
 
                   _("There are different answers for this question:\n\n")\
205
 
                     .append(answers),
206
 
                   _("&Merge and edit"),
207
 
                   _("&Add as is"),
208
 
                   _("&Do not add"), 0, -1)
209
 
 
210
 
                if status == 0: # Merge and edit.
211
 
 
212
 
                    new_card = add_new_card(grade, q, a, cat_names, id)
213
 
                    self.update_combobox(cat_names)
214
 
 
215
 
                    for i in same_questions:
216
 
                        new_card.grade = min(new_card.grade, i.grade)
217
 
                        new_card.a += ' / ' + i.a
218
 
                        delete_card(i)
219
 
 
220
 
                    dlg = EditCardDlg(new_card, self)
221
 
 
222
 
                    dlg.exec_loop()
223
 
 
224
 
                    return new_card
225
 
 
226
 
                if status == 2: # Don't add.
227
 
                    return None
228
 
 
229
 
        new_card = add_new_card(grade, q, a, cat_names, id)
230
 
        self.update_combobox(cat_names)
231
 
 
232
 
        return new_card
233
 
 
234
 
 
235
 
 
236
 
    ##########################################################################
237
 
    #
238
 
    # update_cards
239
 
    #
240
 
    ##########################################################################
241
 
 
242
 
    def update_cards(self, data):
243
 
 
244
 
        pass
245
 
 
 
31
        self.name = _("Front-to-back only")
 
32
        self.id   = 1
 
33
 
 
34
        # Name the keys.
 
35
 
 
36
        self.fact_key_names['q'] = _("Question")
 
37
        self.fact_key_names['a'] = _("Answer")
 
38
        
 
39
        # Front to back.
 
40
 
 
41
        v = FactView(_("Front-to-back"))
 
42
 
 
43
        v.q_fields.append(("q", True))
 
44
        
 
45
        v.a_fields.append(("a", False))       
 
46
 
 
47
        self.fact_views.append(v)
 
48