예제 #1
0
    def __call__(self):
        long = self.request.params.get('longitude')
        lat = self.request.params.get('latitude')
        try:
            tz = int(self.request.params.get('tz', 0))
        except (TypeError, ValueError):
            tz = 0

        session = get_platform().session(long, lat, tz=tz)
        get_platform().get_storage().set(session)

        new_session_url = '%s/%s' % (self.request.application_url,
                                     session.admin_id)

        cookie_age = int(settings.get('mappp.me.storage.expires', 0))

        new_cookie = session.admin_id
        if self.request.existing_sessions:
            new_cookie = ','.join(self.request.existing_sessions +
                                  [session.admin_id])

        self.request.response.set_cookie('mappp',
                            new_cookie,
                            max_age=cookie_age,
                            httponly=True)

        # for older browsers
        self.request.response.content_type = 'text/plain'

        return {'admin_link': new_session_url}
예제 #2
0
    def __call__(self):
        get_platform().get_storage().remove(self.request.context)
        self.request.response.delete_cookie('mappp')

        front_page_url = '%s/' % (self.request.application_url,)

        raise HTTPFound(location=front_page_url)
예제 #3
0
 def __init__(self, longitude, latitude, tz=None):
     storage = get_platform().get_storage()
     self._id = storage.get_new_id()
     self._admin_id = storage.get_new_id(admin=True)
     self._tz = tz or 0
     self.longitude = longitude
     self.latitude = latitude
     self.last_updated = self.created = datetime.datetime.now(tz=self.tz)
예제 #4
0
    def existing_sessions(self):
        """Get a list of mappps that are currently valid for this
           browser session.
        """
        
        existing_sessions = self.cookies.get('mappp')
        if existing_sessions:
            sessions = []
            storage = get_platform().get_storage()
            for session in existing_sessions.split(','):
                if storage.has(session):
                    sessions.append(session)
            if sessions:
                return sessions

            self.response.delete_cookie('mappp')

        return []
예제 #5
0
def SessionFactory(request):
    """Loads a session as the context and applies permissions."""
    
    acl = [(Allow, Everyone, 'view')]

    session_id = request.matchdict.get('session')
    session = get_platform().get_storage().get(session_id)

    if not session:
        raise NotFound('No such session')

    is_admin_link = session_id==session.admin_id

    if is_admin_link:
        acl += [(Allow, Everyone, 'owner')]

    session.__acl__ = acl
    return session
예제 #6
0
from pyramid.decorator import reify
from pyramid.request import Request
from pywurfl.algorithms import TwoStepAnalysis
from wurfl import devices

from mappp.me.platform import get_platform


_ua_device_cache = get_platform().ua_device_cache


def on_newrequest(event):
    """Fix the https bug in Pyramid / Paste."""
    
    if 'HTTP_X_VHM_ROOT' in event.request.environ:
        event.request.environ['wsgi.url_scheme'] = 'https'


class EnhancedRequest(Request):

    @reify
    def device(self):
        """Look up the device profile based on the UA and cache it on
           the request object.
        """
        
        global _ua_device_cache
        ua = unicode(self.user_agent)

        if "HTTP_X_OPERAMINI_PHONE_UA" in self.environ:
            # Opera mini proxy specia case
예제 #7
0
 def cache(self):
     """Get the platform-specific cache."""
     
     # Defer creation of cache so we may create the platform first
     return get_platform().memory_cache(max_bytes=self.cache_size)
예제 #8
0
    def populate(self, request):
        is_wml = request.environ.get('PATH_INFO', '').endswith('.wml')

        if not is_wml and \
           'text/vnd.wap.wml' in request.accept and \
           request.accept.best_match(['text/html',
                                      'application/json',
                                      'text/javascript',
                                      'application/xhtml+xml',
                                      'text/vnd.wap.wml',
                                      ])=='text/vnd.wap.wml':
            wml_uri = '%s/%s.wml' % (request.application_url,
                                     request.context.id)
            raise HTTPFound(location=wml_uri)

        is_owner_view = bool(has_permission('owner', request.context, request))

        today = datetime.datetime.now(tz=request.context.tz).replace(hour=0, minute=0, second=0, microsecond=0)
        created = request.context.created
        created_text = created.strftime('%H:%M')
        if created < today:
            diff = today - created
            if diff > datetime.timedelta(days=1):
                created_text = '%s %s days ago' % (created_text, diff.days)
            else:
                created_text = '%s yesterday' % (created_text,)
        else:
            created_text = '%s today' % (created_text,)

        zoom = 13
        if False not in [c.isdigit() for c in request.params.get('zoom', 'foo')] or \
           False not in [c.isdigit() for c in request.cookies.get('zoom', 'foo')]:
            zoom = int(request.params.get('zoom') or request.cookies.get('zoom'))

        map_upgrade = False
#        map_upgrade = request.supports_javascript and \
#                      request.device.resolution_width>=600 and \
#                      (
#                          request.device.is_tablet or
#                          request.device.wifi or
#                          request.device.brand_name=='Desktop' or
#                          not request.device.mobile_browser
#                      )

        result = {'is_owner_view': is_owner_view,
                  'latitude': request.context.latitude,
                  'longitude': request.context.longitude,
                  'created': created_text,
                  'sms_link': '',
                  #'marker_style': 'icon:' + quote(request.static_url('mappp.me:static/images/pointer-small-filled-transparent.png')),
                  'marker_style': quote('color:white|size:med'),
                  'quoted_uri': quote(request.route_url('session', session=request.context.id)),
                  'zoom': zoom,
                  'map_upgrade': map_upgrade,
                  'user_is_owner': request.context.admin_id in request.existing_sessions
                  }

        send_string = request.device.xhtml_send_sms_string
        if send_string!=u'none':
            if request.device.mobile_browser!=u'Android Webkit':
                # workaround for:
                # http://code.google.com/p/android/issues/detail?id=11451
                # http://code.google.com/p/android/issues/detail?id=12142
                # http://code.google.com/p/android/issues/detail?id=15866
                result['sms_link'] = '%s?body=%s' % (send_string,
                                                     quote('Find me at %s/%s .' %
                                                           (request.application_url,
                                                            request.context.id)))

        if request.method=='POST' and is_owner_view:

            long = float(request.params.get('longitude'))
            lat = float(request.params.get('latitude'))

            request.context.update(long, lat)

            get_platform().get_storage().set(request.context)

            result.update({'latitude': lat,
                           'longitude': long})

        last_updated = request.context.last_updated.astimezone(request.context.tz)
        result['last_updated'] = last_updated.strftime('%H:%M')
        expires = (last_updated + datetime.timedelta(minutes=30)).astimezone(request.context.tz)
        result['expires'] = format_date_time(mktime(expires.timetuple()))
        request.response.expires = expires
        request.response.last_modified = last_updated
        request.response.cache_control = 'no-cache'

        if request.method=='POST' and is_owner_view:

            result['response'] = render_to_response('json', result,
                                                    request=request)

            if request.existing_sessions:
                # reset the ages
                cookie_age = int(settings.get('mappp.me.storage.expires', 0))

                self.request.response.set_cookie('mappp',
                                                 ','.join(request.existing_sessions),
                                                 max_age=cookie_age,
                                                 httponly=True)

        if is_wml:
            request.response.content_type = 'text/vnd.wap.wml'

        return result