Switch to unified view

a/OSSEval/methodology/models.py b/OSSEval/methodology/models.py
1
from django.db import models
1
from django.db import models
2
from entity.models import Entity
2
from entity.models import Entity
3
3
from OSSEval.utils import xmlMinidom
4
    
4
    
5
class Methodology(models.Model):
5
class Methodology(models.Model):
6
    name = models.CharField(max_length=200)
6
    name = models.CharField(max_length=200)
7
    description = models.CharField(max_length=2000,null=True,blank=True)
7
    description = models.CharField(max_length=2000,null=True,blank=True)
8
    documentation = models.TextField(null=True,blank=True)
8
    documentation = models.TextField(null=True,blank=True)
9
    active = models.BooleanField(default=True)
9
    active = models.BooleanField(default=True)
10
    # The entity type the methodology helps you assess
10
    # The entity type the methodology helps you assess
11
    entity = models.ForeignKey(Entity)
11
    entity = models.ForeignKey(Entity)
12
    
12
    def __unicode__(self):
13
    def __unicode__(self):
13
        return self.name
14
        return self.name
15
    
16
    def from_xml(self, xmldoc, insert = True):
17
        if not insert:
18
            self.id = xmldoc.getElementsByTagName('Id')[0].firstChild.data
19
        self.name = xmlMinidom.getString(xmldoc, 'Name')
20
        print str(self.id) + " " + self.name
21
        self.description = xmlMinidom.getString(xmldoc, 'Description')
22
        self.documentation = xmlMinidom.getString(xmldoc, 'Documentation')
23
        self.active = xmlMinidom.getString(xmldoc, 'Active')
24
        e = Entity()
25
        xml_entity = xmldoc.getElementsByTagName('Entity')[0]
26
        e.from_xml(xml_entity, insert)
27
        self.entity = e
28
        # I save so I get the ID (if insert == True)
29
        self.save()
30
        
31
    def to_xml(self):
32
        str_xml = "<Id>" + str(self.id) + "</Id>"
33
        str_xml += "<Name>" + self.name + "</Name>"
34
        str_xml += "<Description>" + self.description + "</Description>"
35
        str_xml += "<Documentation>" + self.documentation + "</Documentation>"
36
        str_xml += "<Active>" + str(self.active) + "</Active>"
37
        str_xml += self.entity.to_xml()
38
        return "<Methodology>" + str_xml + "</Methodology>"
39
        
14
40
15
class MethodologyVersion(models.Model):
41
class MethodologyVersion(models.Model):
16
    number = models.IntegerField()
42
    number = models.IntegerField()
17
    created = models.DateField() 
43
    created = models.DateField() 
18
    current = models.BooleanField(default=False)
44
    current = models.BooleanField(default=False)
19
    methodology = models.ForeignKey(Methodology)
45
    methodology = models.ForeignKey(Methodology)
46
    
20
    def __unicode__(self):
47
    def __unicode__(self):
21
        return self.methodology.name + " - " + str(self.number) + (" (Active version)" if self.current else "")
48
        return self.methodology.name + " - " + str(self.number) + (" (Active version)" if self.current else "")
49
50
    def from_xml(self, xmldoc, insert = True):
51
        if not insert:
52
            self.id = xmldoc.getElementsByTagName('Id')[0].firstChild.data
53
        self.number = xmldoc.getElementsByTagName('Number')[0].firstChild.data
54
        self.created = xmlMinidom.getString(xmldoc, 'Created')
55
        self.current = xmlMinidom.getString(xmldoc, 'Current')
56
        m = Methodology()
57
        xml_methodology = xmldoc.getElementsByTagName('Methodology')[0]
58
        m.from_xml(xml_methodology, insert)
59
        self.methodology = m
60
        # I save so I get the ID (if insert == True)
61
        self.save()
62
        # Pages
63
        for xml_child in xmldoc.childNodes:
64
            if xml_child.tagName == 'Pages':
65
                xml_pages = xml_child
66
                break
67
        for xml_page in xml_pages.childNodes:
68
            if xml_page.tagName == 'Page':
69
                p = Page()
70
                p.from_xml(xml_page, self, None, insert)
71
        #WeightScenarios
72
        xml_weight_scenarios = xmldoc.getElementsByTagName('WeightScenarios')
73
        for xml_weight_scenario in xml_weight_scenarios:
74
            ws = WeightScenario()
75
            ws.from_xml(xml_weight_scenario, self, insert)
76
        
77
    def to_xml(self):
78
        str_xml = "<Id>" + str(self.id) + "</Id>"
79
        str_xml += "<Number>" + str(self.number) + "</Number>"
80
        str_xml += "<Created>" + str(self.created) + "</Created>"
81
        str_xml += "<Current>" + str(self.current) + "</Current>"
82
        str_xml += self.methodology.to_xml()
83
        str_xml += "<Pages>"
84
        for page in self.page_set.all():
85
            str_xml += page.to_xml()
86
        str_xml += "</Pages>"
87
        str_xml += "<WeightScenarios>"
88
        for weight_scenario in self.weightscenario_set.all():
89
            str_xml += weight_scenario.to_xml()
90
        str_xml += "</WeightScenarios>"
91
             
92
        return "<MethodologyVersion>" + str_xml + "</MethodologyVersion>"
22
93
23
class Page(models.Model):
94
class Page(models.Model):
24
    name = models.CharField(max_length=200)
95
    name = models.CharField(max_length=200)
25
    order = models.IntegerField(null=False,blank=False)
96
    order = models.IntegerField(null=False,blank=False)
26
    parent = models.ForeignKey('self',null=True,blank=True)
97
    parent = models.ForeignKey('self',null=True,blank=True)
27
    methodology_version = models.ForeignKey(MethodologyVersion)
98
    methodology_version = models.ForeignKey(MethodologyVersion,null=True,blank=True)
99
    
28
    def __unicode__(self):
100
    def __unicode__(self):
29
        return self.name
101
        return self.name
30
    
102
    
103
    def from_xml(self, xmldoc, methodology_version, parent_page, insert = True):
104
        if not insert:
105
            self.id = xmldoc.getElementsByTagName('Id')[0].firstChild.data
106
        self.name = xmlMinidom.getString(xmldoc, 'Name')
107
        self.order = xmldoc.getElementsByTagName('Order')[0].firstChild.data
108
        if methodology_version is not None:
109
            self.methodology_version = methodology_version
110
        if parent_page is not None:
111
            self.parent = parent_page
112
        # Pages
113
        for xml_child in xmldoc.childNodes:
114
            if xml_child.tagName == 'Pages':
115
                xml_pages = xml_child
116
                break
117
        for xml_page in xml_pages.childNodes:
118
            if xml_page.tagName == 'Page':
119
                p = Page()
120
                p.from_xml(xml_page, None, self, insert)
121
        # Questions
122
        xml_questions = xmldoc.getElementsByTagName('Questions')
123
        for xml_question in xml_questions:
124
            q = Question()
125
            q.from_xml(xml_question, self, insert)
126
        
127
    def to_xml(self):
128
        str_xml = "<Id>" + str(self.id) + "</Id>"
129
        str_xml += "<Name>" + self.name + "</Name>"
130
        str_xml += "<Order>" + str(self.order) + "</Order>"
131
        str_xml += "<Pages>"
132
        for page in self.page_set.all():
133
            str_xml += page.to_xml()
134
        str_xml += "</Pages>"
135
        str_xml += "<Questions>"
136
        for question in self.question_set.all():
137
            str_xml += question.to_xml()
138
        str_xml += "</Questions>"
139
        return "<Page>" + str_xml + "</Page>"
140
    
31
class QuestionType(models.Model):
141
class QuestionType(models.Model):
32
    name = models.CharField(max_length=200)
142
    name = models.CharField(max_length=200)
33
143
    
144
    def from_xml(self, xmldoc, insert = True):
145
        pass
146
    
147
    def to_xml(self):
148
        return "<QuestionType><Id>" + str(self.id) + "</Id><Name>" + self.name + "</Name></QuestionType>"
149
    
34
class Question(models.Model):
150
class Question(models.Model):
35
    page = models.ForeignKey(Page)
151
    page = models.ForeignKey(Page)
36
    text = models.CharField(max_length=200)
152
    text = models.CharField(max_length=200)
37
    eval_description = models.TextField(null=True,blank=True)
153
    eval_description = models.TextField(null=True,blank=True)
38
    eval_value = models.TextField(null=True,blank=True)
154
    eval_value = models.TextField(null=True,blank=True)
39
    question_type =  models.ForeignKey(QuestionType)
155
    question_type =  models.ForeignKey(QuestionType)
156
    
40
    def __unicode__(self):
157
    def __unicode__(self):
41
        return self.page.name + " - " + self.text
158
        return self.page.name + " - " + self.text
159
    
160
    def from_xml(self, xmldoc, page, insert = True):
161
        pass
162
    
163
    def to_xml(self):
164
        str_xml = "<Id>" + str(self.id) + "</Id>"
165
        str_xml += "<Text>" + self.text + "</Text>"
166
        str_xml += "<EvalDescription>" + ("" if self.eval_description is None else self.eval_description) + "</EvalDescription>"
167
        str_xml += "<EvalValue>" + ("" if self.eval_value is None else self.eval_value) + "</EvalValue>"
168
        str_xml += self.question_type.to_xml()
169
        str_xml += "<Queries>"
170
        for query in self.query_set.all():
171
            str_xml += query.to_xml()
172
        for choice in self.choice_set.all():
173
            str_xml += choice.to_xml()
174
        str_xml += "</Queries>"
175
        return "<Question>" + str_xml + "</Question>"
42
176
43
class Query(models.Model):
177
class Query(models.Model):
178
    '''
179
    Queries against web search engines used to automate the answer to a question and/or as a hint to the reviewer 
180
    '''
44
    question = models.ForeignKey(Question)
181
    question = models.ForeignKey(Question)
45
    eval_text = models.CharField(max_length=2000)
182
    eval_text = models.CharField(max_length=2000)
46
    eval_site = models.CharField(max_length=2000)
183
    eval_site = models.CharField(max_length=2000)
47
    eval_site_exclude = models.CharField(max_length=2000)
184
    eval_site_exclude = models.CharField(max_length=2000)
185
    
186
    def from_xml(self, xmldoc, insert = True):
187
        pass
188
    
189
    def to_xml(self):
190
        str_xml = "<Id>" + str(self.id) + "</Id>"
191
        str_xml += "<EvalText>" + self.eval_text + "</EvalText>"
192
        str_xml += "<EvalSite>" + self.eval_site + "</EvalSite>"
193
        str_xml += "<EvalSiteExclude>" + self.eval_site_exclude + "</EvalSiteExclude>"
194
        return "<Query>" + str_xml + "</Query>"    
48
195
49
class Choice(models.Model):
196
class Choice(models.Model):
197
    '''
198
    '''
50
    question = models.ForeignKey(Question)
199
    question = models.ForeignKey(Question)
200
    text = models.CharField(max_length=200)
51
    order = models.IntegerField()
201
    order = models.IntegerField()
52
    todo = models.CharField(max_length=2000)
202
    todo = models.CharField(max_length=2000)
203
    
204
    def from_xml(self, xmldoc, insert = True):
205
        pass
206
    
207
    def to_xml(self):
208
        str_xml = "<Id>" + str(self.id) + "</Id>"
209
        str_xml += "<Text>" + self.text + "</Text>"
210
        str_xml += "<Order>" + str(self.order) + "</Order>"
211
        str_xml += "<Todo>" + self.todo + "</Todo>"
212
        return "<Choice>" + str_xml + "</Choice>"    
53
213
54
class WeightScenario(models.Model):
214
class WeightScenario(models.Model):
55
    name = models.CharField(max_length=200)
215
    name = models.CharField(max_length=200)
56
    methodology_version = models.ForeignKey(MethodologyVersion)
216
    methodology_version = models.ForeignKey(MethodologyVersion)
57
    active = models.BooleanField(blank=False)
217
    active = models.BooleanField(blank=False)
218
    
219
    def from_xml(self, xmldoc, methodology_version, insert = True):
220
        self.methodology_version = methodology_version
221
        pass
222
    
223
    def to_xml(self):
224
        str_xml = "<Id>" + str(self.id) + "</Id>"
225
        str_xml += "<Name>" + self.name + "</Name>"
226
        str_xml += "<Active>" + str(self.active) + "</Active>"
227
        str_xml += "<Weights>"
228
        for weight in self.weight_set.all():
229
            str_xml += weight.to_xml()
230
        str_xml += "</Weights>"
231
        return "<WeightScenario>" + str_xml + "</WeightScenario>"
58
232
59
class Weight(models.Model):
233
class Weight(models.Model):
60
    question = models.ForeignKey(Question)
234
    question = models.ForeignKey(Question)
61
    weight = models.FloatField()
235
    weight = models.FloatField()
62
    scenario = models.ForeignKey(WeightScenario)
236
    scenario = models.ForeignKey(WeightScenario)
237
    
238
    def from_xml(self, xmldoc, insert = True):
239
        pass
240
    
241
    def to_xml(self):
242
        str_xml = "<Id>" + str(self.id) + "</Id>"
243
        str_xml += "<Active>" + self.active + "</Active>"
244
        str_xml += "<Weights>"
245
        for weight in self.weight_set.all():
246
            str_xml += weight.to_xml()
247
        str_xml += "</Weights>"
248
        return "<WeightScenario>" + str_xml + "</WeightScenario>"