summaryrefslogtreecommitdiffstats
path: root/releng/views.py
blob: 8699c5b220c34322fef5635224433de476ca98e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
from base64 import b64decode
import json

from django.core.serializers.json import DjangoJSONEncoder
from django.urls import reverse
from django.http import Http404, HttpResponse
from django.shortcuts import get_object_or_404, render
from django.views.generic import DetailView, ListView
from django.conf import settings

from .models import Release
from mirrors.models import MirrorUrl


class ReleaseListView(ListView):
    model = Release


class ReleaseDetailView(DetailView):
    model = Release
    slug_field = 'version'
    slug_url_kwarg = 'version'


def release_torrent(request, version):
    release = get_object_or_404(Release, version=version)
    if not release.torrent_data:
        raise Http404
    data = b64decode(release.torrent_data.encode('utf-8'))
    response = HttpResponse(data, content_type='application/x-bittorrent')
    # TODO: this is duplicated from Release.iso_url()
    filename = 'archlinux-%s-x86_64.iso.torrent' % release.version
    response['Content-Disposition'] = 'attachment; filename=%s' % filename
    return response


class ReleaseJSONEncoder(DjangoJSONEncoder):
    release_attributes = ('release_date', 'version', 'kernel_version',
                          'created', 'md5_sum', 'sha1_sum')

    def default(self, obj):
        if isinstance(obj, Release):
            data = {attr: getattr(obj, attr) or None
                    for attr in self.release_attributes}
            data['available'] = obj.available
            data['iso_url'] = '/' + obj.iso_url()
            data['magnet_uri'] = obj.magnet_uri()
            data['torrent_url'] = reverse('releng-release-torrent', args=[obj.version])
            data['info'] = obj.info_html()
            torrent_data = obj.torrent()
            if torrent_data:
                torrent_data.pop('url_list', None)
            data['torrent'] = torrent_data
            return data
        return super(ReleaseJSONEncoder, self).default(obj)


def releases_json(request):
    releases = Release.objects.all()
    try:
        latest_version = Release.objects.filter(available=True).values_list(
                'version', flat=True).latest()
    except Release.DoesNotExist:
        latest_version = None

    data = {
        'version': 1,
        'releases': list(releases),
        'latest_version': latest_version,
    }
    to_json = json.dumps(data, ensure_ascii=False, cls=ReleaseJSONEncoder)
    response = HttpResponse(to_json, content_type='application/json')
    return response


def netboot_config(request):
    releases = Release.objects.filter(available=True).values_list('version', flat=True).order_by('-release_date')
    mirrorurls = MirrorUrl.objects.filter(protocol__protocol='http',
                                          active=True,
                                          mirror__public=True,
                                          mirror__active=True,
                                          mirror__isos=True)
    mirrorurls = sorted(mirrorurls, key=lambda x: x.mirror.name)
    mirrorurls = sorted(mirrorurls, key=lambda x: x.country.name)
    context = {
        'releases': releases,
        'mirrorurls': mirrorurls,
    }
    return render(request, "releng/archlinux.ipxe", context, content_type='text/plain')


def netboot_info(request):
    return render(request, "releng/netboot.html", 
            {'security_banner':  settings.NETBOOT_SECURITY_BANNER})

# vim: set ts=4 sw=4 et: