Skip to content
Snippets Groups Projects
Commit ed5857d0 authored by Tim Fechner's avatar Tim Fechner Committed by Tim Fechner
Browse files

Close #5, custom documentation blocks

parent 7e5debd6
Branches
No related tags found
No related merge requests found
Showing
with 248 additions and 26 deletions
......@@ -20,7 +20,7 @@ class NetworkInterfaceInline(admin.TabularInline):
class MinionAdmin(admin.ModelAdmin):
inlines = [NetworkInterfaceInline]
readonly_fields = ('fqdn', 'data', 'last_updated')
exclude = ('_data', 'md_content')
exclude = ('_data',)
admin.site.register(Minion, MinionAdmin)
......
......@@ -53,3 +53,8 @@
}
}
}
form textarea {
resize: vertical;
font-family: @font-family-monospace;
}
......@@ -3,9 +3,41 @@ from django.contrib.auth.forms import AuthenticationForm
from django.utils.translation import ugettext, ugettext_lazy as _
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit, Layout, Div, Field, HTML, Fieldset
from crispy_forms.layout import Submit, Layout, Div, Field, HTML
from crispy_forms.bootstrap import StrictButton, PrependedText
from salt_observer.models import (
Domain, Minion, Network
)
class MarkdownFormMixin(forms.ModelForm):
md_content = forms.CharField(
widget=forms.Textarea(attrs={'class': 'form-control', 'rows': 15, 'autofocus': 'True', 'placeholder': '# Some Markdown'}),
label='',
required=False
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_method = 'post'
self.helper.form_class = 'form-horizontal'
self.helper.label_class = ''
self.helper.field_class = 'col-lg-12'
self.helper.layout = Layout(
Div(Field('md_content')),
Div(StrictButton('Save', type='submit', css_class='btn-primary'))
)
class Meta:
abstract = True
fields = ['md_content']
class LoginForm(AuthenticationForm):
......@@ -41,3 +73,21 @@ class LoginForm(AuthenticationForm):
username = forms.CharField(label='', max_length=255)
password = forms.CharField(label='', widget=forms.PasswordInput)
class MinionEditForm(MarkdownFormMixin):
class Meta:
model = Minion
fields = ['md_content']
class NetworkEditForm(MarkdownFormMixin):
class Meta:
model = Network
fields = ['md_content']
class DomainEditForm(MarkdownFormMixin):
class Meta:
model = Domain
fields = ['md_content']
# -*- coding: utf-8 -*-
# Generated by Django 1.9.4 on 2016-07-19 13:40
from __future__ import unicode_literals
import datetime
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
from django.utils.timezone import utc
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('salt_observer', '0015_auto_20160718_1812'),
]
operations = [
migrations.AddField(
model_name='domain',
name='md_last_autor',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='domain',
name='md_last_edited',
field=models.DateTimeField(default=datetime.datetime(2016, 7, 19, 13, 39, 49, 713447, tzinfo=utc)),
preserve_default=False,
),
migrations.AddField(
model_name='minion',
name='md_last_autor',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='minion',
name='md_last_edited',
field=models.DateTimeField(default=datetime.datetime(2016, 7, 19, 13, 39, 55, 586008, tzinfo=utc)),
preserve_default=False,
),
migrations.AddField(
model_name='network',
name='md_last_autor',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='network',
name='md_last_edited',
field=models.DateTimeField(default=datetime.datetime(2016, 7, 19, 13, 40, 0, 498161, tzinfo=utc)),
preserve_default=False,
),
]
from django.db import models
from django.conf import settings
import json
import requests
......@@ -8,6 +9,8 @@ class MarkdownContent(models.Model):
''' To enable on-the-fly modification of templates '''
md_content = models.TextField(blank=True)
md_last_edited = models.DateTimeField()
md_last_autor = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True)
class Meta:
abstract = True
......
Source diff could not be displayed: it is too large. Options to address this: view the blob.
{% extends 'navbar.html' %}
{% load so_extras %}
{% block nav-domains %}class="active"{% endblock %}
......@@ -23,7 +24,23 @@
<div role="tabpanel" class="tab-pane fade in active" id="general">
<div class="row">
<div class="col-md-8">
<i>Hier soll man in Zukunft eigenes Markdown hinterlegen können ...</i>
{% block general-tab %}
<a class="text-muted pull-right" href="{% url 'domain-edit' domain.fqdn %}"><i class="fa fa-2x fa-pencil"></i></a>
{% if domain.md_content %}
<div>
{{ domain.md_content|markdownify }}
</div>
<hr>
<div class="footnote">
<i class="text-muted">Last edited {{ domain.md_last_edited|date:"d.m.y - H:i" }} from {{ domain.md_last_autor.username }}</i>
</div>
{% else %}
<i class="text-muted">No special information about this domain yet. But you can <a href="{% url 'domain-edit' domain.fqdn %}">edit</a> this section!</i>
{% endif %}
{% endblock %}
</div>
<div class="col-md-4">
<table class="table datatable">
......
{% extends 'domain/detail.html' %}
{% load crispy_forms_tags %}
{% block nav-domains %}class="active"{% endblock %}
{% block general-tab %}
{% crispy form %}
{% endblock %}
......@@ -53,7 +53,23 @@
<div role="tabpanel" class="tab-pane fade in active" id="general">
<div class="row">
<div class="col-md-8">
<i>Hier soll man in Zukunft eigenes Markdown hinterlegen können ...</i>
{% block general-tab %}
<a class="text-muted pull-right" href="{% url 'minion-edit' minion.fqdn %}"><i class="fa fa-2x fa-pencil"></i></a>
{% if minion.md_content %}
<div>
{{ minion.md_content|markdownify }}
</div>
<hr>
<div class="footnote">
<i class="text-muted">Last edited {{ minion.md_last_edited|date:"d.m.y - H:i" }} from {{ minion.md_last_autor.username }}</i>
</div>
{% else %}
<i class="text-muted">No special information about this minion yet. But you can <a href="{% url 'minion-edit' minion.fqdn %}">edit</a> this section!</i>
{% endif %}
{% endblock %}
</div>
<div class="col-md-4">
<table class="table datatable">
......@@ -288,9 +304,4 @@
<!-- tab panes end -->
</div>
</div>
<hr/>
<p class="footnote text-muted">
<i>Daten aktuell vom {{ minion.last_updated|date:"d.m.y - H:i" }} Uhr</i>
</p>
{% endblock %}
{% extends 'minion/detail.html' %}
{% load crispy_forms_tags %}
{% block nav-minions %}class="active"{% endblock %}
{% block general-tab %}
{% crispy form %}
{% endblock %}
{% extends 'navbar.html' %}
{% load so_extras %}
{% block nav-networks %}class="active"{% endblock %}
......@@ -22,7 +23,23 @@
<div role="tabpanel" class="tab-pane fade in active" id="general">
<div class="row">
<div class="col-md-8">
<i>Hier soll man in Zukunft eigenes Markdown hinterlegen können ...</i>
{% block general-tab %}
<a class="text-muted pull-right" href="{% url 'network-edit' network.ipv4 %}"><i class="fa fa-2x fa-pencil"></i></a>
{% if network.md_content %}
<div>
{{ network.md_content|markdownify }}
</div>
<hr>
<div class="footnote">
<i class="text-muted">Last edited {{ network.md_last_edited|date:"d.m.y - H:i" }} from {{ network.md_last_autor.username }}</i>
</div>
{% else %}
<i class="text-muted">No special information about this network yet. But you can <a href="{% url 'network-edit' network.ipv4 %}">edit</a> this section!</i>
{% endif %}
{% endblock %}
</div>
<div class="col-md-4">
<table class="table datatable">
......@@ -70,9 +87,4 @@
</div>
</div>
</div>
<hr/>
<p class="footnote text-muted">
<i>Daten aktuell vom {{ network.last_updated|date:"d.m.y - H:i" }} Uhr</i>
</p>
{% endblock %}
{% extends 'network/detail.html' %}
{% load crispy_forms_tags %}
{% block nav-networks %}class="active"{% endblock %}
{% block general-tab %}
{% crispy form %}
{% endblock %}
from django import template
from django.utils.safestring import mark_safe
from markdown import Markdown
register = template.Library()
@register.filter
def get(value, arg):
return value.get(arg, '')
@register.filter
def markdownify(value):
return mark_safe(Markdown().convert(value))
......@@ -5,9 +5,9 @@ from django.contrib.auth.decorators import login_required
from .views import (
Login, Logout,
Dashboard,
MinionList, MinionDetail,
NetworkList, NetworkDetail,
DomainList, DomainDetail
MinionList, MinionDetail, MinionEdit,
NetworkList, NetworkDetail, NetworkEdit,
DomainList, DomainDetail, DomainEdit
)
......@@ -25,10 +25,13 @@ urlpatterns = [
auth_url(r'^$', Dashboard.as_view(), name='dashboard'),
auth_url(r'^minions/$', MinionList.as_view(), name='minion-list'),
auth_url(r'^minions/(?P<slug>[a-zA-Z0-9\.\-]+)/$', MinionDetail.as_view(), name='minion-detail'),
auth_url(r'^minions/(?P<slug>[a-zA-Z0-9\.\-]+)/edit/$', MinionEdit.as_view(), name='minion-edit'),
auth_url(r'^networks/$', NetworkList.as_view(), name='network-list'),
auth_url(r'^networks/(?P<slug>[a-zA-Z0-9\.\-]+)/$', NetworkDetail.as_view(), name='network-detail'),
auth_url(r'^networks/(?P<slug>[a-zA-Z0-9\.\-]+)/edit/$', NetworkEdit.as_view(), name='network-edit'),
auth_url(r'^domains/$', DomainList.as_view(), name='domain-list'),
auth_url(r'^domains/(?P<slug>[a-zA-Z0-9\.\-]+)/$', DomainDetail.as_view(), name='domain-detail'),
auth_url(r'^domains/(?P<slug>[a-zA-Z0-9\.\-]+)/edit/$', DomainEdit.as_view(), name='domain-edit'),
]
......@@ -2,8 +2,9 @@ from django.template import Context, Template
from django.views.generic import View, TemplateView
from django.views.generic.list import ListView
from django.views.generic.detail import DetailView
from django.views.generic.edit import FormView
from django.views.generic.edit import FormView, UpdateView
from django.core.urlresolvers import reverse_lazy
from django.utils import timezone
from django.utils.safestring import mark_safe
from django.contrib.auth import login, logout
from django.shortcuts import render
......@@ -12,12 +13,29 @@ from django.conf import settings
from markdown import Markdown
from salt_observer.forms import LoginForm
from salt_observer.forms import (
LoginForm,
MinionEditForm, NetworkEditForm, DomainEditForm
)
from salt_observer.models import (
Minion, Network, Domain
)
class MarkdownEditMixin(object):
def form_valid(self, form, *args, **kwargs):
obj = self.get_object()
obj.md_content = form.cleaned_data.get('md_content', '')
obj.md_last_autor = self.request.user
obj.md_last_edited = timezone.now()
obj.save()
return super().form_valid(form, *args, **kwargs)
def get_success_url(self, *args, **kwargs):
return reverse_lazy(self.success_url_name, args=[self.kwargs.get('slug', '')])
class Login(FormView):
template_name = 'auth/login.html'
form_class = LoginForm
......@@ -53,23 +71,35 @@ class MinionList(ListView):
model = Minion
class NetworkList(ListView):
template_name = 'network/list.html'
model = Network
class MinionDetail(DetailView):
template_name = 'minion/detail.html'
model = Minion
slug_field = 'fqdn'
class MinionEdit(MarkdownEditMixin, UpdateView, MinionDetail):
template_name = 'minion/edit.html'
form_class = MinionEditForm
success_url_name = 'minion-detail'
class NetworkList(ListView):
template_name = 'network/list.html'
model = Network
class NetworkDetail(DetailView):
template_name = 'network/detail.html'
model = Network
slug_field = 'ipv4'
class NetworkEdit(MarkdownEditMixin, UpdateView, NetworkDetail):
template_name = 'network/edit.html'
form_class = NetworkEditForm
success_url_name = 'network-detail'
class DomainList(ListView):
template_name = 'domain/list.html'
model = Domain
......@@ -79,3 +109,9 @@ class DomainDetail(DetailView):
template_name = 'domain/detail.html'
model = Domain
slug_field = 'fqdn'
class DomainEdit(MarkdownEditMixin, UpdateView, DomainDetail):
template_name = 'domain/edit.html'
form_class = DomainEditForm
success_url_name = 'domain-detail'
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment