From 2fdbc151c297cef57ae4d642dac2916c543caf94 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Sat, 28 Sep 2013 17:29:02 +0200 Subject: [PATCH 1/4] remove test example, see test_dnstools for an example --- nsupdate/main/_tests/test_example.py | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 nsupdate/main/_tests/test_example.py diff --git a/nsupdate/main/_tests/test_example.py b/nsupdate/main/_tests/test_example.py deleted file mode 100644 index e7d3d1a..0000000 --- a/nsupdate/main/_tests/test_example.py +++ /dev/null @@ -1,11 +0,0 @@ -""" -Tests for xxx module. -""" - - -class Tests(object): - def test_basic_addition(self): - """ - Tests that 1 + 1 always equals 2. - """ - assert 1 + 1 == 2 From 7655928c1b6b23ff453cd43d6659ec4b90692773 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Sat, 28 Sep 2013 18:01:43 +0200 Subject: [PATCH 2/4] change README.md to README.rst (setuptools wants .rst .txt or no extension) --- README.md => README.rst | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) rename README.md => README.rst (67%) diff --git a/README.md b/README.rst similarity index 67% rename from README.md rename to README.rst index 40a82e3..d8fc997 100644 --- a/README.md +++ b/README.rst @@ -11,23 +11,23 @@ Installation If you haven't already done create and change to a virtualenv for the installation (here with virtualenvwrapper) -``` -mkvirtualenv nsupdate -workon nsupdate -``` + + mkvirtualenv nsupdate + workon nsupdate + Clone the repo and cd into -``` -git clone git@github.com:asmaps/nsupdate.info.git nsupdate -cd nsupdate -``` + + git clone git@github.com:asmaps/nsupdate.info.git nsupdate + cd nsupdate + Then install the requirements (either "dev" or just "all" for production) -``` -pip install -r requirements.d/all.txt -#or for dev -pip install -r requirements.d/dev.txt -``` + + pip install -r requirements.d/all.txt + # or for dev + pip install -r requirements.d/dev. + From time to time execute this again to install the newest dependencies. From 22eecac4d5fad6a89deb6b1e966be47749cd4a87 Mon Sep 17 00:00:00 2001 From: Arne Schauf Date: Sat, 28 Sep 2013 18:02:13 +0200 Subject: [PATCH 3/4] Host model --- nsupdate/accounts/tests.py | 16 ---- nsupdate/main/migrations/0001_initial.py | 76 ++++++++++++++++ .../0002_auto__del_hosts__add_host.py | 90 +++++++++++++++++++ nsupdate/main/migrations/__init__.py | 0 nsupdate/main/models.py | 14 ++- 5 files changed, 179 insertions(+), 17 deletions(-) delete mode 100644 nsupdate/accounts/tests.py create mode 100644 nsupdate/main/migrations/0001_initial.py create mode 100644 nsupdate/main/migrations/0002_auto__del_hosts__add_host.py create mode 100644 nsupdate/main/migrations/__init__.py diff --git a/nsupdate/accounts/tests.py b/nsupdate/accounts/tests.py deleted file mode 100644 index 501deb7..0000000 --- a/nsupdate/accounts/tests.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -This file demonstrates writing tests using the unittest module. These will pass -when you run "manage.py test". - -Replace this with more appropriate tests for your application. -""" - -from django.test import TestCase - - -class SimpleTest(TestCase): - def test_basic_addition(self): - """ - Tests that 1 + 1 always equals 2. - """ - self.assertEqual(1 + 1, 2) diff --git a/nsupdate/main/migrations/0001_initial.py b/nsupdate/main/migrations/0001_initial.py new file mode 100644 index 0000000..8e24b83 --- /dev/null +++ b/nsupdate/main/migrations/0001_initial.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'Hosts' + db.create_table(u'main_hosts', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('fqdn', self.gf('django.db.models.fields.CharField')(max_length=256)), + ('update_secret', self.gf('django.db.models.fields.CharField')(max_length=256)), + ('last_update', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)), + ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), + ('created_by', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + )) + db.send_create_signal(u'main', ['Hosts']) + + + def backwards(self, orm): + # Deleting model 'Hosts' + db.delete_table(u'main_hosts') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'main.hosts': { + 'Meta': {'object_name': 'Hosts'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), + 'fqdn': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_update': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'update_secret': ('django.db.models.fields.CharField', [], {'max_length': '256'}) + } + } + + complete_apps = ['main'] \ No newline at end of file diff --git a/nsupdate/main/migrations/0002_auto__del_hosts__add_host.py b/nsupdate/main/migrations/0002_auto__del_hosts__add_host.py new file mode 100644 index 0000000..04388f1 --- /dev/null +++ b/nsupdate/main/migrations/0002_auto__del_hosts__add_host.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Deleting model 'Hosts' + db.delete_table(u'main_hosts') + + # Adding model 'Host' + db.create_table(u'main_host', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('fqdn', self.gf('django.db.models.fields.CharField')(max_length=256)), + ('update_secret', self.gf('django.db.models.fields.CharField')(max_length=256)), + ('last_update', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)), + ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), + ('created_by', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + )) + db.send_create_signal(u'main', ['Host']) + + + def backwards(self, orm): + # Adding model 'Hosts' + db.create_table(u'main_hosts', ( + ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), + ('fqdn', self.gf('django.db.models.fields.CharField')(max_length=256)), + ('created_by', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('last_update', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)), + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('update_secret', self.gf('django.db.models.fields.CharField')(max_length=256)), + )) + db.send_create_signal(u'main', ['Hosts']) + + # Deleting model 'Host' + db.delete_table(u'main_host') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'main.host': { + 'Meta': {'object_name': 'Host'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), + 'fqdn': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_update': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'update_secret': ('django.db.models.fields.CharField', [], {'max_length': '256'}) + } + } + + complete_apps = ['main'] \ No newline at end of file diff --git a/nsupdate/main/migrations/__init__.py b/nsupdate/main/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nsupdate/main/models.py b/nsupdate/main/models.py index 71a8362..59db370 100644 --- a/nsupdate/main/models.py +++ b/nsupdate/main/models.py @@ -1,3 +1,15 @@ from django.db import models +from django.contrib.auth.models import User + + +class Host(models.Model): + fqdn = models.CharField(max_length=256) + update_secret = models.CharField(max_length=256) + + last_update = models.DateTimeField(auto_now=True) + created = models.DateTimeField(auto_now_add=True) + created_by = models.ForeignKey(User) + + def __unicode__(self): + return u"%s (%s)" % (self.fqdn, self.created_by) -# Create your models here. From 4a3751732c032f4e4406f5a45f91fce9d73610c4 Mon Sep 17 00:00:00 2001 From: Arne Schauf Date: Sat, 28 Sep 2013 18:33:45 +0200 Subject: [PATCH 4/4] user profile edit name form --- nsupdate/accounts/forms.py | 10 ++++++++++ .../templates/accounts/user_profile.html | 11 +++++++++++ nsupdate/accounts/views.py | 17 +++++++++++++++-- 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 nsupdate/accounts/forms.py diff --git a/nsupdate/accounts/forms.py b/nsupdate/accounts/forms.py new file mode 100644 index 0000000..ac33696 --- /dev/null +++ b/nsupdate/accounts/forms.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- + +from django import forms +from django.contrib.auth.models import User + +class UserProfileForm(forms.ModelForm): + class Meta: + model = User + fields = ['first_name', 'last_name', ] + diff --git a/nsupdate/accounts/templates/accounts/user_profile.html b/nsupdate/accounts/templates/accounts/user_profile.html index 9abad34..774ab56 100644 --- a/nsupdate/accounts/templates/accounts/user_profile.html +++ b/nsupdate/accounts/templates/accounts/user_profile.html @@ -1,5 +1,16 @@ {% extends "base.html" %} +{% load bootstrap %} {% block content %}

Hi, {{ request.user.username }}

+

Your data:

+
+
+
+ {% csrf_token %} + {{ form|bootstrap }} + +
+
+
{% endblock %} diff --git a/nsupdate/accounts/views.py b/nsupdate/accounts/views.py index 23adef5..34b42f4 100644 --- a/nsupdate/accounts/views.py +++ b/nsupdate/accounts/views.py @@ -1,9 +1,22 @@ # -*- coding: utf-8 -*- -from django.views.generic import TemplateView +from django.views.generic import TemplateView, UpdateView +from django.contrib.auth.models import User +from django.core.urlresolvers import reverse + +from .forms import UserProfileForm -class UserProfileView(TemplateView): +class UserProfileView(UpdateView): template_name = "accounts/user_profile.html" + model = User + fields = ['first_name', 'last_name'] + form_class = UserProfileForm + + def get_object(self): + return self.request.user + + def get_success_url(self): + return reverse('account_profile') def get_context_data(self, *args, **kwargs): context = super(UserProfileView, self).get_context_data(*args, **kwargs)