source: dashwiki/wiki/views.py @ 48380833447903591eee8117daadc89fdd641664

Revision 48380833447903591eee8117daadc89fdd641664, 9.9 KB checked in by Stanislaw Klekot <dozzie@…>, 7 years ago (diff)

Added login/logout forms.

  • Property mode set to 100644
Line 
1#-----------------------------------------------------------------------------
2# preamble {{{
3#-----------------------------------------------------------------------------
4# imports {{{
5
6from django.http import HttpResponse
7from django.template import Context, loader
8from wiki.models import WikiPage
9
10# TODO: enable CSRF protection
11from django.views.decorators.csrf import csrf_exempt
12
13import yaml
14# yaml.dump(something, default_flow_style = False)
15
16# }}}
17#-----------------------------------------------------------------------------
18# tooling {{{
19
20def load_wiki_or_null(page_name):
21  from django.core.exceptions import ObjectDoesNotExist
22
23  try:
24    page = WikiPage.objects.get(name = page_name)
25  except ObjectDoesNotExist, e:
26    page = None
27
28  return page
29
30# }}}
31#-----------------------------------------------------------------------------
32# sample data {{{
33
34macros = [
35  {
36    'name': 'active_conns',
37    'in_args' : 'server,port',
38    'out_args': '$server,$port',
39    'destination': 'http://nagios.atled.pl/connections',
40    'protocol'   : 'HTTP',
41    'result_type': 'graph',
42  },
43  {
44    'name': 'servers',
45    'in_args' : '',
46    'out_args': '',
47    'destination': 'http://nagios.atled.pl/list-of-servers.txt',
48    'protocol'   : 'HTTP',
49    'result_type': 'list',
50  },
51  {
52    'name': 'uptime',
53    'in_args' : 'server',
54    'out_args': '',
55    'destination': 'http://$server.atled.pl/uptime',
56    'protocol'   : 'XML-RPC',
57    'result_type': 'string',
58  },
59]
60
61# }}}
62#-----------------------------------------------------------------------------
63# }}}
64#-----------------------------------------------------------------------------
65# wiki pages {{{
66#-----------------------------------------------------------------------------
67
68@csrf_exempt
69def handle_wiki(request, page_name):
70  if 'cancel' in request.POST:
71    return redirect_to_display_wiki(request, page_name)
72  elif 'save' in request.POST:
73    return save_wiki(request, page_name)
74  elif 'edit' in request.POST or 'edit' in request.GET:
75    return edit_wiki(request, page_name)
76  elif 'remove' in request.POST:
77    return remove_wiki(request, page_name)
78  else:
79    return display_wiki(request, page_name)
80
81#-----------------------------------------------------------------------------
82# display_wiki() {{{
83
84@csrf_exempt
85def display_wiki(request, page_name):
86  template = loader.get_template('display_wiki.html')
87
88  page = load_wiki_or_null(page_name)
89  context = Context({
90    'name': page_name,
91    'body': page.content if page else None,
92    'editable': True,
93  })
94
95  return HttpResponse(template.render(context))
96
97# }}}
98#-----------------------------------------------------------------------------
99# edit_wiki() {{{
100
101@csrf_exempt
102def edit_wiki(request, page_name):
103  template = loader.get_template('edit_wiki.html')
104
105  page = load_wiki_or_null(page_name)
106  context = Context({
107    'name': page_name,
108    'body': page.content if page else None,
109    'form_target': request.path,
110  })
111
112  return HttpResponse(template.render(context))
113
114# }}}
115#-----------------------------------------------------------------------------
116# save_wiki() {{{
117
118@csrf_exempt
119def save_wiki(request, page_name):
120  template = loader.get_template('display_wiki.html')
121
122  page = load_wiki_or_null(page_name)
123  context = Context({
124    'name': page_name,
125    'body': page.content if page else None,
126    'editable': True,
127    'message': 'Wiki page saved'
128  })
129
130  return HttpResponse(template.render(context))
131
132# }}}
133#-----------------------------------------------------------------------------
134# redirect_to_display_wiki() {{{
135
136@csrf_exempt
137def redirect_to_display_wiki(request, page_name):
138  response = HttpResponse(status = 302)
139  response['location'] = request.path
140  return response
141
142# }}}
143#-----------------------------------------------------------------------------
144# create_wiki() {{{
145
146@csrf_exempt
147def create_wiki(request):
148  if 'cancel' in request.POST:
149    from django.core.urlresolvers import reverse
150    response = HttpResponse(status = 302)
151    response['location'] = reverse(handle_wiki, args = ['WikiStart'])
152    return response
153
154  template = loader.get_template('create_wiki.html')
155
156  proposed_name = request.POST.get('page_name', None)
157  if proposed_name:
158    import re
159    if not re.match('^[A-Z][A-Za-z0-9_/]+$', proposed_name):
160      context = Context({
161        'error': 'invalid name',
162        'page_name': proposed_name,
163      })
164      return HttpResponse(template.render(context))
165
166    if WikiPage.objects.filter(name = proposed_name).exists():
167      context = Context({
168        'error': 'page already exists',
169        'page_name': proposed_name,
170      })
171      return HttpResponse(template.render(context))
172
173    context = Context({
174      'message': 'Page %s created' % proposed_name,
175      'page_name': proposed_name,
176      'created': True,
177    })
178    return HttpResponse(template.render(context))
179
180  context = Context({})
181  return HttpResponse(template.render(context))
182
183# }}}
184#-----------------------------------------------------------------------------
185# remove_wiki() {{{
186
187@csrf_exempt
188def remove_wiki(request, page_name):
189  template = loader.get_template('remove_wiki.html')
190
191  page = load_wiki_or_null(page_name)
192  context = Context({
193    'name': page_name,
194    'form_target': request.path,
195    'confirmed': ('confirm' in request.POST),
196  })
197
198  return HttpResponse(template.render(context))
199
200# }}}
201#-----------------------------------------------------------------------------
202# }}}
203#-----------------------------------------------------------------------------
204# navigation {{{
205#-----------------------------------------------------------------------------
206# list_history() {{{
207
208def list_history(request):
209  template = loader.get_template('list_history.html')
210  context = Context({})
211  return HttpResponse(template.render(context))
212
213# }}}
214#-----------------------------------------------------------------------------
215# list_pages() {{{
216
217def list_pages(request):
218  template = loader.get_template('list_pages.html')
219
220  pages = [page.name for page in WikiPage.objects.all()]
221  pages.sort()
222
223  context = Context({
224    'pages': pages,
225  })
226  return HttpResponse(template.render(context))
227
228# }}}
229#-----------------------------------------------------------------------------
230# }}}
231#-----------------------------------------------------------------------------
232# macros {{{
233#-----------------------------------------------------------------------------
234# list_macros() {{{
235
236def list_macros(request):
237  template = loader.get_template('list_macros.html')
238  context = Context({
239    'macros': macros,
240  })
241  return HttpResponse(template.render(context))
242
243# }}}
244#-----------------------------------------------------------------------------
245# create_macro() {{{
246
247@csrf_exempt
248def create_macro(request):
249  if 'cancel' in request.POST:
250    from django.core.urlresolvers import reverse
251    response = HttpResponse(status = 302)
252    response['location'] = reverse(list_macros)
253    return response
254
255  template = loader.get_template('create_macro.html')
256  macro = None
257
258  if 'save' in request.POST:
259    context = Context({
260      'macro': macro,
261      'message': 'macro created',
262      'created': True,
263    })
264  else:
265    context = Context({
266      'macro': macro,
267    })
268
269  return HttpResponse(template.render(context))
270
271# }}}
272#-----------------------------------------------------------------------------
273# edit_macro() {{{
274
275@csrf_exempt
276def edit_macro(request, macro_name):
277  if 'cancel' in request.POST:
278    from django.core.urlresolvers import reverse
279    response = HttpResponse(status = 302)
280    response['location'] = reverse(list_macros)
281    return response
282
283  template = loader.get_template('edit_macro.html')
284  macro = [m for m in macros if m['name'] == macro_name]
285  macro = macro[0] if len(macro) > 0 else None
286
287  if 'save' in request.POST:
288    context = Context({
289      'macro': macro,
290      'message': 'macro saved',
291      'created': True,
292    })
293  else:
294    context = Context({
295      'macro': macro,
296    })
297
298  return HttpResponse(template.render(context))
299
300# }}}
301#-----------------------------------------------------------------------------
302# remove_macro() {{{
303
304@csrf_exempt
305def remove_macro(request, macro_name):
306  if 'cancel' in request.POST:
307    from django.core.urlresolvers import reverse
308    response = HttpResponse(status = 302)
309    response['location'] = reverse(list_macros)
310    return response
311
312  template = loader.get_template('remove_macro.html')
313
314  context = Context({
315    'name': macro_name,
316    'confirmed': ('confirm' in request.POST),
317  })
318
319  return HttpResponse(template.render(context))
320
321# }}}
322#-----------------------------------------------------------------------------
323# }}}
324#-----------------------------------------------------------------------------
325# sessions {{{
326#-----------------------------------------------------------------------------
327# login() {{{
328
329@csrf_exempt
330def login(request):
331  if 'cancel' in request.POST:
332    from django.core.urlresolvers import reverse
333    response = HttpResponse(status = 302)
334    response['location'] = reverse(handle_wiki, args = ['WikiStart'])
335    return response
336
337  if 'submit' in request.POST:
338    if request.POST['user_name'] in \
339       ['tdrag', 'mbaczynska', 'sklekot', 'bzmudzinski']:
340      context = Context({
341        'success': True,
342        'tried': True,
343        'message': 'Logged in successfully.',
344      })
345    else:
346      context = Context({
347        'success': False,
348        'tried': True,
349        'error': 'Login failure. Incorrect user name or password.',
350      })
351  else:
352    context = Context({})
353
354  template = loader.get_template('login.html')
355  return HttpResponse(template.render(context))
356
357# }}}
358#-----------------------------------------------------------------------------
359# logout() {{{
360
361def logout(request):
362  context = Context({
363    'message': 'User logged out.',
364  })
365  template = loader.get_template('logout.html')
366  return HttpResponse(template.render(context))
367
368# }}}
369#-----------------------------------------------------------------------------
370# }}}
371#-----------------------------------------------------------------------------
372# vim:ft=python:foldmethod=marker
Note: See TracBrowser for help on using the repository browser.