| 1 | import os |
|---|
| 2 | from datetime import date |
|---|
| 3 | from django.conf import settings |
|---|
| 4 | from django.http import HttpResponse |
|---|
| 5 | from django.contrib.auth.decorators import user_passes_test |
|---|
| 6 | from django.contrib.admin.views.decorators import staff_member_required |
|---|
| 7 | |
|---|
| 8 | from django.core import serializers |
|---|
| 9 | from django.core.exceptions import ImproperlyConfigured |
|---|
| 10 | from django.core.management.commands.dumpdata import sort_dependencies |
|---|
| 11 | from django.db import router, DEFAULT_DB_ALIAS |
|---|
| 12 | from django.db.models import get_apps, get_app |
|---|
| 13 | |
|---|
| 14 | from django.shortcuts import render_to_response |
|---|
| 15 | from django.utils.datastructures import SortedDict |
|---|
| 16 | |
|---|
| 17 | @staff_member_required |
|---|
| 18 | def export_database(request): |
|---|
| 19 | #output backup |
|---|
| 20 | stdin,stdout = os.popen2(r'which mysqldump') |
|---|
| 21 | stdin.close() |
|---|
| 22 | |
|---|
| 23 | mysqldump_bin = stdout.readline().replace('\n','') |
|---|
| 24 | stdout.close() |
|---|
| 25 | |
|---|
| 26 | cmd = mysqldump_bin+' --opt --compact --skip-add-locks -u %s -p%s %s | bzip2 -c' % (settings.DATABASE_USER, settings.DATABASE_PASSWORD, settings.DATABASE_NAME) |
|---|
| 27 | print cmd |
|---|
| 28 | stdin, stdout = os.popen2(cmd) |
|---|
| 29 | stdin.close() |
|---|
| 30 | |
|---|
| 31 | response = HttpResponse(stdout, mimetype="application/octet-stream") |
|---|
| 32 | response['Content-Disposition'] = 'attachment; filename=%s' % date.today().__str__()+'_db.sql.bz2' |
|---|
| 33 | return response |
|---|
| 34 | |
|---|
| 35 | @staff_member_required |
|---|
| 36 | def dump_data(request,appname): |
|---|
| 37 | app_list = SortedDict() |
|---|
| 38 | |
|---|
| 39 | try: |
|---|
| 40 | app = get_app(appname) |
|---|
| 41 | app_list[app] = None |
|---|
| 42 | except ImproperlyConfigured: |
|---|
| 43 | if appname == 'all': |
|---|
| 44 | for app in get_apps(): |
|---|
| 45 | app_list[app] = None |
|---|
| 46 | |
|---|
| 47 | if(len(app_list) > 0): |
|---|
| 48 | objects = [] |
|---|
| 49 | for model in sort_dependencies(app_list.items()): |
|---|
| 50 | if not model._meta.proxy and router.allow_syncdb(DEFAULT_DB_ALIAS, model): |
|---|
| 51 | objects.extend(model._default_manager.using(DEFAULT_DB_ALIAS).all()) |
|---|
| 52 | serializers.get_serializer('json') |
|---|
| 53 | json = serializers.serialize('json', objects, indent=2,use_natural_keys=True) |
|---|
| 54 | response = HttpResponse(json, mimetype='application/json'); |
|---|
| 55 | response['Content-Disposition'] = 'attachment; filename=%s_%s_fixture.json' % (date.today().__str__(),appname) |
|---|
| 56 | return response |
|---|
| 57 | |
|---|
| 58 | return render_to_response('diagnostic/dumpdata.html') |
|---|
| 59 | |
|---|
| 60 | def smoke_test(request): |
|---|
| 61 | from datetime import datetime |
|---|
| 62 | return HttpResponse(datetime.now().strftime('%H:%M:%S')) |
|---|
| 63 | |
|---|
| 64 | @user_passes_test(lambda u: u.is_staff) |
|---|
| 65 | def req_dump(request): |
|---|
| 66 | template = ''' |
|---|
| 67 | <form action="./" method="POST"> |
|---|
| 68 | <input type="text" name="word" value="mitochondrial"> |
|---|
| 69 | <input type="submit" name="btn1" value="one"> |
|---|
| 70 | <input type="submit" name="btn2" value="two"> |
|---|
| 71 | </form> |
|---|
| 72 | <table border="1"> |
|---|
| 73 | <tr><th>key</th><th>POST[key]</th></tr> |
|---|
| 74 | %s |
|---|
| 75 | </table> |
|---|
| 76 | <hr> |
|---|
| 77 | <p> |
|---|
| 78 | <a href="this_is_a_broken_link">Click to test broken link notification</a> |
|---|
| 79 | </p> |
|---|
| 80 | ''' |
|---|
| 81 | rows = [] |
|---|
| 82 | for k in request.POST.keys(): |
|---|
| 83 | rows.append('<tr><th>%s</th><td>%s</td></tr>' % (k, request.POST[k])) |
|---|
| 84 | return HttpResponse(template % ('\n'.join(rows))) |
|---|
| 85 | |
|---|
| 86 | @user_passes_test(lambda u: u.is_staff) |
|---|
| 87 | def sys_info(request): |
|---|
| 88 | template = u''' |
|---|
| 89 | <h1>Site.objects.get_current()</h1> |
|---|
| 90 | <table> |
|---|
| 91 | <tr><th>id</th><td>%(site.pk)s</td></tr> |
|---|
| 92 | <tr><th>domain</th><td>%(site.domain)s</td></tr> |
|---|
| 93 | <tr><th>name</th><td>%(site.name)s</td></tr> |
|---|
| 94 | </table> |
|---|
| 95 | <h1>settings path</h1> |
|---|
| 96 | <pre>%(settingspath)s</pre> |
|---|
| 97 | <h1>svn info</h1> |
|---|
| 98 | <pre>%(svninfo)s</pre> |
|---|
| 99 | <h1>sys.path</h1> |
|---|
| 100 | <pre>%(syspath)s</pre> |
|---|
| 101 | ''' |
|---|
| 102 | import sys |
|---|
| 103 | import settings |
|---|
| 104 | from django.contrib.sites.models import Site |
|---|
| 105 | from subprocess import Popen, PIPE |
|---|
| 106 | site = Site.objects.get_current() |
|---|
| 107 | svnout, svnerr = Popen(['svn', 'info', '-r', 'HEAD', settings.PROJECT_PATH], stdout=PIPE).communicate() |
|---|
| 108 | svnout = svnout.decode('utf-8') if svnout else u'' |
|---|
| 109 | svnerr = svnerr.decode('utf-8') if svnerr else u'' |
|---|
| 110 | return HttpResponse(template % {'site.pk':site.pk, |
|---|
| 111 | 'site.domain':site.domain, |
|---|
| 112 | 'site.name':site.name, |
|---|
| 113 | 'settingspath': settings.PROJECT_PATH, |
|---|
| 114 | 'syspath':'\n'.join(sys.path), |
|---|
| 115 | 'svninfo':svnout + svnerr}) |
|---|
| 116 | |
|---|
| 117 | @user_passes_test(lambda u: u.is_staff) |
|---|
| 118 | def raise_error(request): |
|---|
| 119 | class FakeError(StandardError): |
|---|
| 120 | ''' this is just to test error e-mails and logging ''' |
|---|
| 121 | raise FakeError('This is not really an error') |
|---|
| 122 | |
|---|
| 123 | |
|---|