~widelands-dev/widelands-website/trunk

« back to all changes in this revision

Viewing changes to mainpage/wl_utils.py

  • Committer: Holger Rapp
  • Date: 2019-06-21 18:34:42 UTC
  • mfrom: (540.1.3 update_ops_script)
  • Revision ID: sirver@gmx.de-20190621183442-y2ulybzr0rdvfefd
Adapt the update script for the new server.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
def get_real_ip(request):
 
3
    """Returns the real user IP, even if behind a proxy."""
 
4
    for key in ('HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR'):
 
5
        if key in request.META:
 
6
            return request.META[key]
 
7
    # No match -> Return a fictional IP to have the model fields not empty
 
8
    return '192.168.255.255'
 
9
 
 
10
 
 
11
# AutoOneToOneField
 
12
# =================
 
13
# Initial implemenation details about AutoOneToOneField:
 
14
#   http://softwaremaniacs.org/blog/2007/03/07/auto-one-to-one-field/
 
15
#
 
16
 
 
17
 
 
18
from django.db.models.fields.related_descriptors import ReverseOneToOneDescriptor
 
19
 
 
20
from django.db.models import OneToOneField
 
21
from django.db import models
 
22
 
 
23
 
 
24
class AutoReverseOneToOneDescriptor(ReverseOneToOneDescriptor):
 
25
    """The descriptor that handles the object creation for an
 
26
    AutoOneToOneField."""
 
27
 
 
28
    def __get__(self, instance, instance_type=None):
 
29
        model = getattr(self.related, 'related_model', self.related.model)
 
30
 
 
31
        try:
 
32
            return (super(AutoReverseOneToOneDescriptor, self)
 
33
                    .__get__(instance, instance_type))
 
34
        except model.DoesNotExist:
 
35
            obj = model(**{self.related.field.name: instance})
 
36
 
 
37
            obj.save()
 
38
 
 
39
            # Don't return obj directly, otherwise it won't be added
 
40
            # to Django's cache, and the first 2 calls to obj.relobj
 
41
            # will return 2 different in-memory objects
 
42
            return (super(AutoReverseOneToOneDescriptor, self)
 
43
                    .__get__(instance, instance_type))
 
44
 
 
45
 
 
46
class AutoOneToOneField(OneToOneField):
 
47
    """OneToOneField creates dependent object on first request from parent
 
48
    object if dependent oject has not created yet."""
 
49
 
 
50
    def contribute_to_related_class(self, cls, related):
 
51
        setattr(cls, related.get_accessor_name(),
 
52
                AutoReverseOneToOneDescriptor(related))
 
53
 
 
54
 
 
55
# Memory based cache does not allow whitespace or control characters in keys
 
56
# We are using a database cache atm, so this is just a forethought to
 
57
# prevent failures when switching to a memory based cache
 
58
def get_valid_cache_key(key):
 
59
    return key.replace(' ', '_')