Is it related to any ticket somehow?
On Tuesday, April 09, 2013 12:56:01 PM Michal Toman wrote:
Signed-off-by: Michal Toman mtoman@redhat.com
pyfaf/hub/menu.py | 3 +++ pyfaf/hub/reports/forms.py | 30 ++++++++++++++++++++++++++- pyfaf/hub/reports/urls.py | 2 ++ pyfaf/hub/reports/views.py | 30 +++++++++++++++++++++++++++ pyfaf/hub/templates/reports/Makefile.am | 2 ++ pyfaf/hub/templates/reports/invalid.html | 26 +++++++++++++++++++++++ pyfaf/hub/templates/reports/invalid_item.html | 24 +++++++++++++++++++++ pyfaf/storage/Makefile.am | 1 + pyfaf/storage/__init__.py | 1 + pyfaf/storage/debug.py | 14 +++++++++++++ 10 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 pyfaf/hub/templates/reports/invalid.html create mode 100644 pyfaf/hub/templates/reports/invalid_item.html create mode 100644 pyfaf/storage/debug.py
diff --git a/pyfaf/hub/menu.py b/pyfaf/hub/menu.py index 76263a2..05a5f0c 100644 --- a/pyfaf/hub/menu.py +++ b/pyfaf/hub/menu.py @@ -230,6 +230,9 @@ menu = ( placeholder=True, url_args_pattern=[42]), MenuItem("Diff", "pyfaf.hub.reports.views.diff", placeholder=True, url_args_pattern=[42, 42]),
StaffMenuItem("Invalid uReports",
"pyfaf.hub.reports.views.invalid"), + StaffMenuItem("Invalid uReport",
"pyfaf.hub.reports.views.invalid_item", placeholder=True), StaffMenuItem("New", "pyfaf.hub.reports.views.new",
on_right=True), )), MenuItem("Statistics", "today_stats", menu=( diff --git a/pyfaf/hub/reports/forms.py b/pyfaf/hub/reports/forms.py index f77ba49..79984a0 100644 --- a/pyfaf/hub/reports/forms.py +++ b/pyfaf/hub/reports/forms.py @@ -1,10 +1,13 @@ +import datetime import json +import logging
from django import forms
from pyfaf import ureport from pyfaf.hub.common.forms import (OsComponentFilterForm, FafMultipleChoiceField) +from pyfaf.storage import getDatabase, InvalidUReport
class ReportFilterForm(OsComponentFilterForm): status_values = ['new', 'processed'] @@ -29,18 +32,43 @@ class ReportFilterForm(OsComponentFilterForm): class NewReportForm(forms.Form): file = forms.FileField(label='uReport file')
def _save_invalid_ureport(self, ureport, errormsg, reporter=None):
try:
db = getDatabase()
new = InvalidUReport()
new.errormsg = errormsg
new.date = datetime.datetime.utcnow()
new.reporter = reporter
db.session.add(new)
db.session.flush()
new.save_lob("ureport", ureport)
except Exception as ex:
logging.error(str(ex))
def clean_file(self): raw_data = self.cleaned_data['file'].read()
try: data = json.loads(raw_data)
except:
except Exception as ex:
self._save_invalid_ureport(raw_data, str(ex)) raise forms.ValidationError('Invalid JSON file') converted = ureport.convert_to_str(data) try: ureport.validate(converted) except Exception as exp:
reporter = None
if ("reporter" in converted and
"name" in converted["reporter"] and
"version" in converted["reporter"]):
reporter = "{0} {1}".format(converted["reporter"]["name"],
converted["reporter"]["version"]) +
self._save_invalid_ureport(json.dumps(data, indent=2),
str(exp), reporter=reporter) raise forms.ValidationError('Validation failed: %s' % exp) return dict(converted=converted, json=raw_data)
diff --git a/pyfaf/hub/reports/urls.py b/pyfaf/hub/reports/urls.py index 34f9d3a..af6f052 100644 --- a/pyfaf/hub/reports/urls.py +++ b/pyfaf/hub/reports/urls.py @@ -9,6 +9,8 @@ urlpatterns = patterns('pyfaf.hub.reports.views', url(r'^new/$', 'new'), url(r'^attach/$', 'attach'), url(r'^bthash/(?P<bthash>[a-fA-F0-9]+)/$', 'bthash_forward'),
url(r'^invalid/$', 'invalid'),
url(r'^invalid/(?P<report_id>[0-9]+)/$', 'invalid_item'),
url(r'^diff/(?P<lhs_id>\d+)/(?P<rhs_id>\d+)/$', 'diff'),
diff --git a/pyfaf/hub/reports/views.py b/pyfaf/hub/reports/views.py index d933c48..1afd2a6 100644 --- a/pyfaf/hub/reports/views.py +++ b/pyfaf/hub/reports/views.py @@ -30,6 +30,7 @@ from pyfaf.storage.report import (Report, ReportPackage, ReportRhbz, ReportUnknownPackage) +from pyfaf.storage.debug import InvalidUReport
from pyfaf.hub.common.utils import paginate from pyfaf.hub.common.forms import OsComponentFilterForm @@ -407,3 +408,32 @@ def bthash_forward(request, bthash): args=[reportbt.backtrace.report.id])
return response
+def invalid(request):
- if not request.user.is_staff:
raise Http404
- db = pyfaf.storage.getDatabase()
- reports = (db.session.query(InvalidUReport)
.order_by(desc(InvalidUReport.date))
.all())
- return render_to_response("reports/invalid.html",
{"reports": paginate(reports, request)},
context_instance=RequestContext(request))
+def invalid_item(request, report_id):
- if not request.user.is_staff:
raise Http404
- db = pyfaf.storage.getDatabase()
- report = (db.session.query(InvalidUReport)
.filter(InvalidUReport.id == report_id)
.first())
- if report is None:
raise Http404
- return render_to_response("reports/invalid_item.html",
{"report": report, "report_data": report.get_lob("ureport")},
context_instance=RequestContext(request))
diff --git a/pyfaf/hub/templates/reports/Makefile.am b/pyfaf/hub/templates/reports/Makefile.am index 8d578c5..e23d33a 100644 --- a/pyfaf/hub/templates/reports/Makefile.am +++ b/pyfaf/hub/templates/reports/Makefile.am @@ -1,6 +1,8 @@ reports_DATA = \ index.html \ item.html \
- invalid.html \
- invalid_item.html \ list.html \ new.html \ success.html \
diff --git a/pyfaf/hub/templates/reports/invalid.html b/pyfaf/hub/templates/reports/invalid.html new file mode 100644 index 0000000..4eae369 --- /dev/null +++ b/pyfaf/hub/templates/reports/invalid.html @@ -0,0 +1,26 @@ +{% extends "base.html" %}
+{% block title %}Invalid uReports list{% endblock %}
+{% block content %}
<table class="table table-bordered">
<tr>
<th>Date</th>
<th>Error</th>
<th>Reporter</th>
<th>uReport</th>
</tr>
- {% for report in reports.object_list %}
<tr>
<td>{{ report.date|date:"Y-m-d" }}</td>
<td>{{ report.errormsg }}</td>
<td>{% if report.reporter %}{{ report.reporter }}{% endif
%}</td> + <td><a href="{% url pyfaf.hub.reports.views.invalid_item report.id %}">Show</a></td> +
</tr> + {% endfor %} + </table> + + {% with reports as paginated %} + {% include "paginator.html" %} + {% endwith %} +{% endblock %} diff --git a/pyfaf/hub/templates/reports/invalid_item.html b/pyfaf/hub/templates/reports/invalid_item.html new file mode 100644 index 0000000..9114b53 --- /dev/null +++ b/pyfaf/hub/templates/reports/invalid_item.html @@ -0,0 +1,24 @@ +{% extends "base.html" %} + +{% block title %}Invalid uReport #{{ report.id }}{% endblock %} + +{% block submenu_append %} + <li class="active"> + <a href="">Invalid uReport #{{ report.id }}</a> + </li> +{% endblock %} + +{% block content %} + <dl class="dl-horizontal"> + <dt>Occurred:</td> + <dd>{{ report.date|date:"Y-m-d H:i:s" }}</dd> + + <dt>Reporter:</td> + <dd>{% if report.reporter %}{{ report.reporter }}{% else %}unknown{% endif %}</dd> + + <dt>Error message:</dt> + <dd>{{ report.errormsg }}</dd> + </dl> + + <pre>{{ report_data }}</pre> +{% endblock %} diff --git a/pyfaf/storage/Makefile.am b/pyfaf/storage/Makefile.am index 43a3357..2fab86d 100644 --- a/pyfaf/storage/Makefile.am +++ b/pyfaf/storage/Makefile.am @@ -3,6 +3,7 @@ SUBDIRS = fixtures pyfaf_storage_PYTHON = \ __init__.py \ common.py \ + debug.py \ hub.py \ kb.py \ llvm.py \ diff --git a/pyfaf/storage/__init__.py b/pyfaf/storage/__init__.py index 5492798..5a5cf40 100644 --- a/pyfaf/storage/__init__.py +++ b/pyfaf/storage/__init__.py @@ -163,6 +163,7 @@ from report import * from llvm import * from hub import * from kb import * +from debug import *
def getDatabase(): db = Database.__instance__ diff --git a/pyfaf/storage/debug.py b/pyfaf/storage/debug.py new file mode 100644 index 0000000..4b76f27 --- /dev/null +++ b/pyfaf/storage/debug.py @@ -0,0 +1,14 @@ +from . import Column +from . import DateTime +from . import GenericTable +from . import Integer +from . import String
+class InvalidUReport(GenericTable):
- __tablename__ = "invalidureports"
- __lobs__ = { "ureport": 1 << 22 }
- id = Column(Integer, primary_key=True)
- errormsg = Column(String(512), nullable=False)
- reporter = Column(String(64), nullable=True)
- date = Column(DateTime, nullable=False, index=True)