Skip to content

Commit 34b03a1

Browse files
committed
Inital code commit with upload funcationality
1 parent 21baefa commit 34b03a1

24 files changed

+611
-0
lines changed

__init__.py

Whitespace-only changes.

apps/__init__.py

Whitespace-only changes.

apps/pinger/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
__author__ = 'ubuntu'

apps/pinger/forms.py

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# -*- coding: utf-8 -*-
2+
from django import forms
3+
from apps.pinger.models import Haystack
4+
from apps.util.forms import BootstrapErrorList
5+
6+
7+
class HaystackCreateModelForm(forms.ModelForm):
8+
error_class=BootstrapErrorList
9+
10+
def __init__(self, *args, **kwargs):
11+
super(HaystackCreateModelForm, self).__init__(*args, **kwargs)
12+
self.error_class=BootstrapErrorList
13+
14+
class Meta:
15+
model = Haystack
16+
fields = ['url', 'search_phrase', 'name']
17+
18+
19+
class UploadFileForm(forms.Form):
20+
file = forms.FileField()
21+
22+
def __init__(self, *args, **kwargs):
23+
super(UploadFileForm, self).__init__(*args, **kwargs)
24+
self.error_class=BootstrapErrorList
25+
26+
def clean_file(self):
27+
'''
28+
Check if uploaded file features correct syntax
29+
'''
30+
_file = self.cleaned_data["file"]
31+
for (num, line) in enumerate(_file):
32+
if len(line.split('|')) < 2:
33+
raise forms.ValidationError("Invalid file format in line %d: %s" % (num+1, line))
34+
return _file

apps/pinger/models.py

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# -*- coding: utf-8 -*-
2+
from django.core.urlresolvers import reverse
3+
from django.db import models
4+
from datetime import datetime as dt
5+
6+
class BaseModel(models.Model):
7+
'''
8+
Model with common fields for all models
9+
All models should inherit this class
10+
'''
11+
created = models.DateTimeField(auto_now=True)
12+
modified = models.DateTimeField(auto_now=True)
13+
14+
def save(self, *args, **kwargs):
15+
self.modified = dt.utcnow()
16+
super(BaseModel, self).save(*args, **kwargs)
17+
18+
19+
class Haystack(BaseModel):
20+
'''
21+
Model holding urls to be checked
22+
'''
23+
name = models.CharField(max_length=255, blank=True, null=True)
24+
url = models.CharField(max_length=255, blank=False, null=False)
25+
search_phrase = models.CharField(max_length=255, blank=True, null=True)
26+
last_checked = models.DateTimeField(null=True)
27+
last_ok = models.DateTimeField(null=True)
28+
last_error = models.DateTimeField(null=True)
29+
last_time_ms = models.IntegerField(default=0)
30+
31+
def __unicode__(self):
32+
return str(self.url)
33+
34+
class Meta:
35+
unique_together = ("url", "search_phrase")
36+
37+
def get_absolute_url(self):
38+
return reverse('hay_update', kwargs={'pk': self.pk})
39+
40+
def get_delete_url(self):
41+
return reverse('hay_delete', kwargs={'pk': self.pk})
42+
43+
class PingHistory(BaseModel):
44+
'''
45+
Model holding health check history
46+
'''
47+
haystack = models.ForeignKey('Haystack')
48+
last_time_ms = models.IntegerField(default=0)
49+
http_code=models.IntegerField(default=0)
50+
time_ms = models.IntegerField(default=0)
51+
phrase_found = models.BooleanField(default=False)
52+
53+
@property
54+
def is_error(self):
55+
'''
56+
Everything else then 200 OK is not ok
57+
'''
58+
return True if self.http_code != 200 and self.phrase_found else False
59+
60+
def save(self, *args, **kwargs):
61+
self.haystack.last_time_ms = self.time_ms
62+
self.haystack.last_checked = self.created
63+
if not self.is_error:
64+
self.haystack.last_ok = dt.utcnow()
65+
else:
66+
self.haystack.last_error = dt.utcnow()
67+
super(self, PingHistory).save(*args, **kwargs)
68+

apps/pinger/ping.py

Whitespace-only changes.

apps/pinger/tests.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"""
2+
This file demonstrates writing tests using the unittest module. These will pass
3+
when you run "manage.py test".
4+
5+
Replace this with more appropriate tests for your application.
6+
"""
7+
8+
from django.test import TestCase
9+
10+
11+
class SimpleTest(TestCase):
12+
def test_basic_addition(self):
13+
"""
14+
Tests that 1 + 1 always equals 2.
15+
"""
16+
self.assertEqual(1 + 1, 2)

apps/pinger/urls.py

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# -*- coding: utf-8 -*-
2+
from django.conf.urls import patterns, url
3+
from apps.pinger.views import HaystackUploadView, HaystackCreateView, HaystackListView, HaystackUpdateView, HaystackDeleteView
4+
5+
urlpatterns = patterns('',
6+
url(r'upload/$', HaystackUploadView.as_view(), name='hay_upload'),
7+
url(r'add/$', HaystackCreateView.as_view(), name='hay_add'),
8+
url(r'list/$', HaystackListView.as_view(), name='hay_list'),
9+
url(r'list/(?P<pk>\d+)/$', HaystackUpdateView.as_view(), name='hay_update'),
10+
url(r'list/(?P<pk>\d+)/delete/$', HaystackDeleteView.as_view(), name='hay_delete'),
11+
12+
url(r'$', HaystackListView.as_view(), name='home'),
13+
)

apps/pinger/views.py

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# -*- coding: utf-8 -*-
2+
from django.http import HttpResponseRedirect
3+
from django.views.generic import CreateView, ListView, UpdateView, DeleteView
4+
from django.views.generic.base import TemplateResponseMixin, ContextMixin, View
5+
from apps.pinger.forms import UploadFileForm, HaystackCreateModelForm
6+
from apps.pinger.models import Haystack
7+
from django.core.urlresolvers import reverse_lazy
8+
from apps.util.mixins import MessageMixin
9+
10+
class HaystackUploadView(TemplateResponseMixin, ContextMixin, View):
11+
form_class = UploadFileForm
12+
template_name = 'pinger/haystack_upload.html'
13+
success_url = reverse_lazy('hay_list')
14+
15+
def get(self, request, *args, **kwargs):
16+
return self.render_to_response(
17+
self.get_context_data(form=self.form_class()))
18+
19+
def post(self, request, *args, **kwargs):
20+
form = self.form_class(request.POST, request.FILES)
21+
if form.is_valid():
22+
#if file is valid, transfer contents to db
23+
_file = form.cleaned_data["file"]
24+
for line in _file:
25+
self.line_to_haystack(line)
26+
return HttpResponseRedirect(self.success_url)
27+
else:
28+
return self.render_to_response(self.get_context_data(form=form))
29+
30+
def line_to_haystack(self, line):
31+
try:
32+
(url, phrase, name) = line.split('|')
33+
except ValueError:
34+
(url, phrase) = line.split('|')
35+
name = None
36+
straw = Haystack(
37+
url=url,
38+
search_phrase=phrase,
39+
name=name,
40+
)
41+
straw.save()
42+
43+
class HaystackListView(ListView):
44+
model = Haystack
45+
46+
class HaystackCreateView(MessageMixin, CreateView):
47+
model = Haystack
48+
form_class = HaystackCreateModelForm
49+
success_message='Added new item!'
50+
success_url = reverse_lazy('hay_list')
51+
52+
class HaystackUpdateView(MessageMixin, UpdateView):
53+
model = Haystack
54+
form_class = HaystackCreateModelForm
55+
success_message='Data was successfully edited'
56+
success_url = reverse_lazy('hay_list')
57+
58+
class HaystackDeleteView(MessageMixin, DeleteView):
59+
model = Haystack
60+
success_message='Link was removed from monitoring system.'
61+
success_url = reverse_lazy('hay_list')

apps/util/__init__.py

Whitespace-only changes.

apps/util/forms.py

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# -*- coding: utf-8 -*-
2+
from django.forms.util import ErrorList
3+
from django.utils.encoding import force_text
4+
from django.utils.html import format_html, format_html_join
5+
6+
7+
class BootstrapErrorList(ErrorList):
8+
"""
9+
A collection of errors that knows how to display itself in various formats.
10+
"""
11+
def as_ul(self):
12+
if not self: return ''
13+
return format_html('<ul class="errorlist">{0}</ul>',
14+
format_html_join('', '<li class="text-error">{0}</li>',
15+
((force_text(e),) for e in self)
16+
)
17+
)

apps/util/mixins.py

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from django.contrib import messages
2+
3+
4+
class MessageMixin(object):
5+
"""
6+
Display notification messages using Class Based Views.
7+
"""
8+
def delete(self, request, *args, **kwargs):
9+
messages.success(self.request, self.success_message)
10+
return super(MessageMixin, self).delete(request, *args, **kwargs)
11+
12+
def form_valid(self, form):
13+
messages.success(self.request, self.success_message)
14+
return super(MessageMixin, self).form_valid(form)

db/default.db

35 KB
Binary file not shown.

manage.py

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#!/usr/bin/env python
2+
import os
3+
import sys
4+
5+
if __name__ == "__main__":
6+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hping.settings")
7+
8+
from django.core.management import execute_from_command_line
9+
10+
execute_from_command_line(sys.argv)

settings/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
__author__ = 'ubuntu'

0 commit comments

Comments
 (0)