2012-03-29 09:37:07 -07:00
from datetime import datetime
2012-11-13 08:03:55 -08:00
import json
2012-04-24 23:32:57 -07:00
from operator import attrgetter
2012-03-29 09:37:07 -07:00
2011-08-19 10:38:17 -07:00
from django . conf import settings
2010-02-04 18:44:46 -08:00
from django . contrib . auth . models import User
2012-03-29 09:37:07 -07:00
from django . db . models import Count , Q
2012-11-13 08:03:55 -08:00
from django . http import Http404 , HttpResponse
2012-07-24 07:35:55 -07:00
from django . shortcuts import render
2012-11-13 08:03:55 -08:00
from django . views . decorators . cache import cache_control , cache_page
2009-10-30 11:56:21 -07:00
2012-03-21 13:52:40 -07:00
from devel . models import MasterKey , PGPSignature
2011-11-30 11:55:36 -08:00
from main . models import Arch , Repo , Donor
from mirrors . models import MirrorUrl
from news . models import News
2012-11-20 17:16:25 -08:00
from releng . models import Release
2011-12-11 17:52:27 -08:00
from . utils import get_recent_updates
2009-10-30 13:32:25 -07:00
2012-11-13 08:03:55 -08:00
2014-10-19 16:12:58 -07:00
@cache_control ( max_age = 307 )
2009-10-30 11:56:21 -07:00
def index ( request ) :
2012-07-30 22:09:28 -07:00
if request . user . is_authenticated ( ) :
2013-12-14 13:06:26 -08:00
def updates ( ) :
return get_recent_updates ( testing = True , staging = True )
2012-07-30 22:09:28 -07:00
else :
2013-12-14 13:06:26 -08:00
def updates ( ) :
return get_recent_updates ( )
2009-10-30 13:32:25 -07:00
context = {
2011-07-22 07:25:57 -07:00
' news_updates ' : News . objects . order_by ( ' -postdate ' , ' -id ' ) [ : 15 ] ,
2013-12-14 13:06:26 -08:00
' pkg_updates ' : updates ,
2009-10-30 13:32:25 -07:00
}
2012-07-24 07:35:55 -07:00
return render ( request , ' public/index.html ' , context )
2009-10-30 14:08:37 -07:00
2011-02-27 09:52:27 -08:00
USER_LISTS = {
' devs ' : {
' user_type ' : ' Developers ' ,
2012-09-24 22:30:05 -07:00
' user_title ' : ' Developer ' ,
2011-02-27 09:52:27 -08:00
' description ' : " This is a list of the current Arch Linux Developers. They maintain the [core] and [extra] package repositories in addition to doing any other developer duties. " ,
} ,
' tus ' : {
' user_type ' : ' Trusted Users ' ,
2012-09-24 22:30:05 -07:00
' user_title ' : ' Trusted User ' ,
2011-02-27 09:52:27 -08:00
' description ' : " Here are all your friendly Arch Linux Trusted Users who are in charge of the [community] repository. " ,
} ,
' fellows ' : {
' user_type ' : ' Fellows ' ,
2012-09-24 22:30:05 -07:00
' user_title ' : ' Fellow ' ,
2011-02-27 09:52:27 -08:00
' description ' : " Below you can find a list of ex-developers (aka project fellows). These folks helped make Arch what it is today. Thanks! " ,
} ,
}
2012-11-13 08:03:55 -08:00
2014-10-19 16:12:58 -07:00
@cache_control ( max_age = 307 )
2011-10-11 17:29:15 -07:00
def userlist ( request , user_type = ' devs ' ) :
2011-11-21 08:08:23 -08:00
users = User . objects . order_by (
' first_name ' , ' last_name ' ) . select_related ( ' userprofile ' )
2011-10-11 17:29:15 -07:00
if user_type == ' devs ' :
2010-03-06 07:20:35 -08:00
users = users . filter ( is_active = True , groups__name = " Developers " )
2011-10-11 17:29:15 -07:00
elif user_type == ' tus ' :
2010-03-06 07:20:35 -08:00
users = users . filter ( is_active = True , groups__name = " Trusted Users " )
2011-10-11 17:29:15 -07:00
elif user_type == ' fellows ' :
2011-11-21 08:08:23 -08:00
users = users . filter ( is_active = False ,
groups__name__in = [ " Developers " , " Trusted Users " ] )
2011-02-27 09:52:27 -08:00
else :
raise Http404
2009-10-30 11:56:21 -07:00
2012-03-09 09:26:00 -08:00
users = users . distinct ( )
2011-10-11 17:29:15 -07:00
context = USER_LISTS [ user_type ] . copy ( )
2011-02-27 09:52:27 -08:00
context [ ' users ' ] = users
2012-07-24 07:35:55 -07:00
return render ( request , ' public/userlist.html ' , context )
2009-10-30 11:56:21 -07:00
2012-11-13 08:03:55 -08:00
2014-10-19 16:12:58 -07:00
@cache_control ( max_age = 307 )
2009-10-30 11:56:21 -07:00
def donate ( request ) :
2009-10-30 14:08:37 -07:00
context = {
2010-10-01 11:05:19 -07:00
' donors ' : Donor . objects . filter ( visible = True ) . order_by ( ' name ' ) ,
2009-10-30 14:08:37 -07:00
}
2012-07-24 07:35:55 -07:00
return render ( request , ' public/donate.html ' , context )
2009-10-30 11:56:21 -07:00
2012-11-13 08:03:55 -08:00
2013-01-19 08:37:14 -08:00
def _mirror_urls ( ) :
''' In order to ensure this is lazily evaluated since we can ' t do
sorting at the database level , make it a callable . '''
urls = MirrorUrl . objects . select_related ( ' mirror ' ) . filter (
2013-06-01 07:21:42 -07:00
active = True , protocol__default = True ,
2013-01-19 08:37:14 -08:00
mirror__public = True , mirror__active = True , mirror__isos = True )
sort_by = attrgetter ( ' country.name ' , ' mirror.name ' )
return sorted ( urls , key = sort_by )
2014-10-19 16:12:58 -07:00
@cache_control ( max_age = 307 )
2009-10-30 11:56:21 -07:00
def download ( request ) :
2012-11-20 17:16:25 -08:00
try :
release = Release . objects . filter ( available = True ) . latest ( )
except Release . DoesNotExist :
release = None
2013-01-18 18:01:22 -08:00
2011-08-19 10:38:17 -07:00
context = {
2012-11-20 17:16:25 -08:00
' release ' : release ,
2011-08-19 10:38:17 -07:00
' releng_iso_url ' : settings . ISO_LIST_URL ,
2011-12-04 08:51:36 -08:00
' releng_pxeboot_url ' : settings . PXEBOOT_URL ,
2013-01-19 08:37:14 -08:00
' mirror_urls ' : _mirror_urls ,
2011-08-19 10:38:17 -07:00
}
2012-07-24 07:35:55 -07:00
return render ( request , ' public/download.html ' , context )
2009-10-30 11:56:21 -07:00
2012-11-13 08:03:55 -08:00
2014-10-19 16:12:58 -07:00
@cache_control ( max_age = 307 )
2010-02-02 20:36:41 -08:00
def feeds ( request ) :
2012-09-24 22:49:54 -07:00
repos = Repo . objects . all ( )
if not request . user . is_authenticated ( ) :
repos = repos . filter ( staging = False )
2010-02-02 20:36:41 -08:00
context = {
' arches ' : Arch . objects . all ( ) ,
2012-09-24 22:49:54 -07:00
' repos ' : repos ,
2010-02-02 20:36:41 -08:00
}
2012-07-24 07:35:55 -07:00
return render ( request , ' public/feeds.html ' , context )
2010-02-02 20:36:41 -08:00
2012-11-13 08:03:55 -08:00
2014-10-19 16:12:58 -07:00
@cache_control ( max_age = 307 )
2011-11-30 11:55:36 -08:00
def keys ( request ) :
2012-07-31 16:37:30 -07:00
users = User . objects . filter ( is_active = True ) . select_related (
' userprofile__pgp_key ' ) . order_by ( ' first_name ' , ' last_name ' )
user_key_ids = frozenset ( user . userprofile . pgp_key [ - 16 : ] for user in users
if user . userprofile . pgp_key )
2012-03-29 09:37:07 -07:00
not_expired = Q ( expires__gt = datetime . utcnow ) | Q ( expires__isnull = True )
2012-03-21 13:52:40 -07:00
master_keys = MasterKey . objects . select_related ( ' owner ' , ' revoker ' ,
' owner__userprofile ' , ' revoker__userprofile ' ) . filter (
revoked__isnull = True )
2012-03-29 09:37:07 -07:00
2013-09-30 18:39:59 -07:00
sig_counts = PGPSignature . objects . filter ( not_expired , revoked__isnull = True ,
2012-12-27 20:51:20 -08:00
signee__in = user_key_ids ) . order_by ( ) . values_list ( ' signer ' ) . annotate (
2012-03-21 13:52:40 -07:00
Count ( ' signer ' ) )
2012-11-16 14:20:11 -08:00
sig_counts = { key_id [ - 16 : ] : ct for key_id , ct in sig_counts }
2012-03-29 09:37:07 -07:00
2012-03-21 13:52:40 -07:00
for key in master_keys :
key . signature_count = sig_counts . get ( key . pgp_key [ - 16 : ] , 0 )
2012-03-29 09:37:07 -07:00
# frozenset because we are going to do lots of __contains__ lookups
signatures = frozenset ( PGPSignature . objects . filter (
2013-09-30 18:39:59 -07:00
not_expired , revoked__isnull = True ) . values_list ( ' signer ' , ' signee ' ) )
2012-03-29 09:37:07 -07:00
2012-07-31 16:37:30 -07:00
restrict = Q ( signer__in = user_key_ids ) & Q ( signee__in = user_key_ids )
cross_signatures = PGPSignature . objects . filter ( restrict ,
2013-09-30 18:39:59 -07:00
not_expired , revoked__isnull = True ) . order_by ( ' created ' )
2012-07-31 16:37:30 -07:00
2011-11-30 11:55:36 -08:00
context = {
2012-03-21 13:52:40 -07:00
' keys ' : master_keys ,
2012-03-29 09:37:07 -07:00
' active_users ' : users ,
' signatures ' : signatures ,
2012-07-31 16:37:30 -07:00
' cross_signatures ' : cross_signatures ,
2011-11-30 11:55:36 -08:00
}
2012-07-24 07:35:55 -07:00
return render ( request , ' public/keys.html ' , context )
2011-11-30 11:55:36 -08:00
2012-11-13 08:03:55 -08:00
2014-10-19 16:12:58 -07:00
@cache_page ( 1789 )
2012-11-13 08:03:55 -08:00
def keys_json ( request ) :
node_list = [ ]
users = User . objects . filter ( is_active = True ) . select_related ( ' userprofile ' )
node_list . extend ( {
' name ' : dev . get_full_name ( ) ,
' key ' : dev . userprofile . pgp_key ,
' group ' : ' dev '
} for dev in users . filter ( groups__name = ' Developers ' ) )
node_list . extend ( {
' name ' : tu . get_full_name ( ) ,
' key ' : tu . userprofile . pgp_key ,
' group ' : ' tu '
} for tu in users . filter ( groups__name = ' Trusted Users ' ) . exclude (
groups__name = ' Developers ' ) )
master_keys = MasterKey . objects . select_related ( ' owner ' ) . filter (
revoked__isnull = True )
node_list . extend ( {
' name ' : ' Master Key ( %s ) ' % key . owner . get_full_name ( ) ,
' key ' : key . pgp_key ,
' group ' : ' master '
} for key in master_keys )
node_list . append ( {
' name ' : ' CA Cert Signing Authority ' ,
' key ' : ' A31D4F81EF4EBD07B456FA04D2BB0D0165D0FD58 ' ,
' group ' : ' cacert ' ,
} )
not_expired = Q ( expires__gt = datetime . utcnow ) | Q ( expires__isnull = True )
2013-09-30 18:39:59 -07:00
signatures = PGPSignature . objects . filter ( not_expired , revoked__isnull = True )
2012-11-13 08:03:55 -08:00
edge_list = [ { ' signee ' : sig . signee , ' signer ' : sig . signer }
for sig in signatures ]
data = { ' nodes ' : node_list , ' edges ' : edge_list }
to_json = json . dumps ( data , ensure_ascii = False )
2013-01-13 20:34:33 -08:00
return HttpResponse ( to_json , content_type = ' application/json ' )
2012-11-13 08:03:55 -08:00
2009-10-30 11:56:21 -07:00
# vim: set ts=4 sw=4 et: