|
1 | 1 | # -*- coding: utf-8 -*- |
2 | 2 | from __future__ import absolute_import |
3 | 3 |
|
4 | | -import logging |
5 | | -from datetime import datetime |
6 | | -from django.core.exceptions import ValidationError |
7 | 4 | from django.conf import settings |
8 | 5 |
|
9 | | -from codespeed.models import (Environment, Executable, Revision, |
10 | | - Project, Branch, Benchmark, |
| 6 | +from codespeed.models import (Executable, Revision, Project, Branch, Benchmark, |
11 | 7 | Result, Report) |
12 | | -from codespeed import commits |
13 | | - |
14 | | -logger = logging.getLogger(__name__) |
15 | 8 |
|
16 | 9 |
|
17 | 10 | def get_default_environment(enviros, data, multi=False): |
@@ -155,140 +148,3 @@ def getcomparisonexes(): |
155 | 148 | all_executables[proj] = executables |
156 | 149 | exekeys += executablekeys |
157 | 150 | return all_executables, exekeys |
158 | | - |
159 | | - |
160 | | -def validate_result(item): |
161 | | - """ |
162 | | - Validates that a result dictionary has all needed parameters |
163 | | -
|
164 | | - It returns a tuple |
165 | | - Environment, False when no errors where found |
166 | | - Errormessage, True when there is an error |
167 | | - """ |
168 | | - mandatory_data = [ |
169 | | - 'commitid', |
170 | | - 'branch', |
171 | | - 'project', |
172 | | - 'executable', |
173 | | - 'benchmark', |
174 | | - 'environment', |
175 | | - 'result_value', |
176 | | - ] |
177 | | - |
178 | | - error = True |
179 | | - for key in mandatory_data: |
180 | | - if key not in item: |
181 | | - return 'Key "' + key + '" missing from request', error |
182 | | - elif key in item and item[key] == "": |
183 | | - return 'Value for key "' + key + '" empty in request', error |
184 | | - |
185 | | - # Check that the Environment exists |
186 | | - try: |
187 | | - e = Environment.objects.get(name=item['environment']) |
188 | | - error = False |
189 | | - return e, error |
190 | | - except Environment.DoesNotExist: |
191 | | - return "Environment %(environment)s not found" % item, error |
192 | | - |
193 | | - |
194 | | -def create_report_if_enough_data(rev, exe, e): |
195 | | - """Triggers Report creation when there are enough results""" |
196 | | - last_revs = Revision.objects.filter( |
197 | | - branch=rev.branch |
198 | | - ).order_by('-date')[:2] |
199 | | - if len(last_revs) > 1: |
200 | | - current_results = rev.results.filter(executable=exe, environment=e) |
201 | | - last_results = last_revs[1].results.filter( |
202 | | - executable=exe, environment=e) |
203 | | - # If there is are at least as many results as in the last revision, |
204 | | - # create new report |
205 | | - if len(current_results) >= len(last_results): |
206 | | - logger.debug("create_report_if_enough_data: About to create new report") |
207 | | - report, created = Report.objects.get_or_create( |
208 | | - executable=exe, environment=e, revision=rev |
209 | | - ) |
210 | | - report.full_clean() |
211 | | - report.save() |
212 | | - logger.debug("create_report_if_enough_data: Created new report.") |
213 | | - |
214 | | - |
215 | | -def save_result(data): |
216 | | - res, error = validate_result(data) |
217 | | - if error: |
218 | | - return res, True |
219 | | - else: |
220 | | - assert(isinstance(res, Environment)) |
221 | | - env = res |
222 | | - |
223 | | - p, created = Project.objects.get_or_create(name=data["project"]) |
224 | | - branch, created = Branch.objects.get_or_create(name=data["branch"], |
225 | | - project=p) |
226 | | - b, created = Benchmark.objects.get_or_create(name=data["benchmark"]) |
227 | | - |
228 | | - if created: |
229 | | - if "description" in data: |
230 | | - b.description = data["description"] |
231 | | - if "units" in data: |
232 | | - b.units = data["units"] |
233 | | - if "units_title" in data: |
234 | | - b.units_title = data["units_title"] |
235 | | - if "lessisbetter" in data: |
236 | | - b.lessisbetter = data["lessisbetter"] |
237 | | - b.full_clean() |
238 | | - b.save() |
239 | | - |
240 | | - try: |
241 | | - rev = branch.revisions.get(commitid=data['commitid']) |
242 | | - except Revision.DoesNotExist: |
243 | | - rev_date = data.get("revision_date") |
244 | | - # "None" (as string) can happen when we urlencode the POST data |
245 | | - if not rev_date or rev_date in ["", "None"]: |
246 | | - rev_date = datetime.today() |
247 | | - rev = Revision(branch=branch, project=p, commitid=data['commitid'], |
248 | | - date=rev_date) |
249 | | - try: |
250 | | - rev.full_clean() |
251 | | - except ValidationError as e: |
252 | | - return str(e), True |
253 | | - if p.repo_type not in ("N", ""): |
254 | | - try: |
255 | | - commit_logs = commits.get_logs(rev, rev, update=True) |
256 | | - except RuntimeError as e: |
257 | | - logger.warning("unable to save revision %s info: %s", rev, e, |
258 | | - exc_info=True) |
259 | | - else: |
260 | | - if commit_logs: |
261 | | - log = commit_logs[0] |
262 | | - rev.author = log['author'] |
263 | | - rev.date = log['date'] |
264 | | - rev.message = log['message'] |
265 | | - |
266 | | - rev.save() |
267 | | - |
268 | | - exe, created = Executable.objects.get_or_create( |
269 | | - name=data['executable'], |
270 | | - project=p |
271 | | - ) |
272 | | - |
273 | | - try: |
274 | | - r = Result.objects.get( |
275 | | - revision=rev, executable=exe, benchmark=b, environment=env) |
276 | | - except Result.DoesNotExist: |
277 | | - r = Result(revision=rev, executable=exe, benchmark=b, environment=env) |
278 | | - |
279 | | - r.value = data["result_value"] |
280 | | - if 'result_date' in data: |
281 | | - r.date = data["result_date"] |
282 | | - elif rev.date: |
283 | | - r.date = rev.date |
284 | | - else: |
285 | | - r.date = datetime.now() |
286 | | - |
287 | | - r.std_dev = data.get('std_dev') |
288 | | - r.val_min = data.get('min') |
289 | | - r.val_max = data.get('max') |
290 | | - |
291 | | - r.full_clean() |
292 | | - r.save() |
293 | | - |
294 | | - return (rev, exe, env), False |
0 commit comments