source: dashwiki/wiki/views.py @ a3086eec3f31bdd96a8bc4498f6490a3d311b560

Revision a3086eec3f31bdd96a8bc4498f6490a3d311b560, 10.1 KB checked in by Tomasz Drag <tomek@…>, 6 years ago (diff)

Added saving and removing changes in database.

  • 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  page = load_wiki_or_null(page_name)
122  if page == None:
123    page = WikiPage(name=page_name)
124  page.content = request.POST['body']
125  page.save()
126  context = Context({
127    'name': page_name,
128    'body': page.content if page else None,
129    'editable': True,
130    'message': 'Wiki page saved'       
131  })
132 
133  return HttpResponse(template.render(context))
134
135# }}}
136#-----------------------------------------------------------------------------
137# redirect_to_display_wiki() {{{
138
139@csrf_exempt
140def redirect_to_display_wiki(request, page_name):
141  response = HttpResponse(status = 302)
142  response['location'] = request.path
143  return response
144
145# }}}
146#-----------------------------------------------------------------------------
147# create_wiki() {{{
148
149@csrf_exempt
150def create_wiki(request):
151  if 'cancel' in request.POST:
152    from django.core.urlresolvers import reverse
153    response = HttpResponse(status = 302)
154    response['location'] = reverse(handle_wiki, args = ['WikiStart'])
155    return response
156
157  template = loader.get_template('create_wiki.html')
158
159  proposed_name = request.POST.get('page_name', None)
160  if proposed_name:
161    import re
162    if not re.match('^[A-Z][A-Za-z0-9_/]+$', proposed_name):
163      context = Context({
164        'error': 'invalid name',
165        'page_name': proposed_name,
166      })
167      return HttpResponse(template.render(context))
168
169    if WikiPage.objects.filter(name = proposed_name).exists():
170      context = Context({
171        'error': 'page already exists',
172        'page_name': proposed_name,
173      })
174      return HttpResponse(template.render(context))
175
176    context = Context({
177      'message': 'Page %s created' % proposed_name,
178      'page_name': proposed_name,
179      'created': True,
180    })
181    return HttpResponse(template.render(context))
182
183  context = Context({})
184  return HttpResponse(template.render(context))
185
186# }}}
187#-----------------------------------------------------------------------------
188# remove_wiki() {{{
189
190@csrf_exempt
191def remove_wiki(request, page_name):
192  template = loader.get_template('remove_wiki.html')
193  page = load_wiki_or_null(page_name)
194  if 'confirm' in request.POST: 
195    # FIXME: How about page = None?
196    page.delete()
197    page = None
198  context = Context({
199    'name': page_name,
200    'form_target': request.path,
201    'confirmed': ('confirm' in request.POST),
202  })
203
204  return HttpResponse(template.render(context))
205
206# }}}
207#-----------------------------------------------------------------------------
208# }}}
209#-----------------------------------------------------------------------------
210# navigation {{{
211#-----------------------------------------------------------------------------
212# list_history() {{{
213
214def list_history(request):
215  template = loader.get_template('list_history.html')
216  context = Context({})
217  return HttpResponse(template.render(context))
218
219# }}}
220#-----------------------------------------------------------------------------
221# list_pages() {{{
222
223def list_pages(request):
224  template = loader.get_template('list_pages.html')
225
226  pages = [page.name for page in WikiPage.objects.all()]
227  pages.sort()
228
229  context = Context({
230    'pages': pages,
231  })
232  return HttpResponse(template.render(context))
233
234# }}}
235#-----------------------------------------------------------------------------
236# }}}
237#-----------------------------------------------------------------------------
238# macros {{{
239#-----------------------------------------------------------------------------
240# list_macros() {{{
241
242def list_macros(request):
243  template = loader.get_template('list_macros.html')
244  context = Context({
245    'macros': macros,
246  })
247  return HttpResponse(template.render(context))
248
249# }}}
250#-----------------------------------------------------------------------------
251# create_macro() {{{
252
253@csrf_exempt
254def create_macro(request):
255  if 'cancel' in request.POST:
256    from django.core.urlresolvers import reverse
257    response = HttpResponse(status = 302)
258    response['location'] = reverse(list_macros)
259    return response
260
261  template = loader.get_template('create_macro.html')
262  macro = None
263
264  if 'save' in request.POST:
265    context = Context({
266      'macro': macro,
267      'message': 'macro created',
268      'created': True,
269    })
270  else:
271    context = Context({
272      'macro': macro,
273    })
274
275  return HttpResponse(template.render(context))
276
277# }}}
278#-----------------------------------------------------------------------------
279# edit_macro() {{{
280
281@csrf_exempt
282def edit_macro(request, macro_name):
283  if 'cancel' in request.POST:
284    from django.core.urlresolvers import reverse
285    response = HttpResponse(status = 302)
286    response['location'] = reverse(list_macros)
287    return response
288
289  template = loader.get_template('edit_macro.html')
290  macro = [m for m in macros if m['name'] == macro_name]
291  macro = macro[0] if len(macro) > 0 else None
292
293  if 'save' in request.POST:
294    context = Context({
295      'macro': macro,
296      'message': 'macro saved',
297      'created': True,
298    })
299  else:
300    context = Context({
301      'macro': macro,
302    })
303
304  return HttpResponse(template.render(context))
305
306# }}}
307#-----------------------------------------------------------------------------
308# remove_macro() {{{
309
310@csrf_exempt
311def remove_macro(request, macro_name):
312  if 'cancel' in request.POST:
313    from django.core.urlresolvers import reverse
314    response = HttpResponse(status = 302)
315    response['location'] = reverse(list_macros)
316    return response
317
318  template = loader.get_template('remove_macro.html')
319
320  context = Context({
321    'name': macro_name,
322    'confirmed': ('confirm' in request.POST),
323  })
324
325  return HttpResponse(template.render(context))
326
327# }}}
328#-----------------------------------------------------------------------------
329# }}}
330#-----------------------------------------------------------------------------
331# sessions {{{
332#-----------------------------------------------------------------------------
333# login() {{{
334
335@csrf_exempt
336def login(request):
337  if 'cancel' in request.POST:
338    from django.core.urlresolvers import reverse
339    response = HttpResponse(status = 302)
340    response['location'] = reverse(handle_wiki, args = ['WikiStart'])
341    return response
342
343  if 'submit' in request.POST:
344    if request.POST['user_name'] in \
345       ['tdrag', 'mbaczynska', 'sklekot', 'bzmudzinski']:
346      context = Context({
347        'success': True,
348        'tried': True,
349        'message': 'Logged in successfully.',
350      })
351    else:
352      context = Context({
353        'success': False,
354        'tried': True,
355        'error': 'Login failure. Incorrect user name or password.',
356      })
357  else:
358    context = Context({})
359
360  template = loader.get_template('login.html')
361  return HttpResponse(template.render(context))
362
363# }}}
364#-----------------------------------------------------------------------------
365# logout() {{{
366
367def logout(request):
368  context = Context({
369    'message': 'User logged out.',
370  })
371  template = loader.get_template('logout.html')
372  return HttpResponse(template.render(context))
373
374# }}}
375#-----------------------------------------------------------------------------
376# }}}
377#-----------------------------------------------------------------------------
378# vim:ft=python:foldmethod=marker
Note: See TracBrowser for help on using the repository browser.