Ejemplo n.º 1
0
    def get (self):
        
        tool_user, db_user = ADayThere.tool_user ()

        if not tool_user or not ADayThere.admin_user (db_user):
            self.response.status = 401 
            self.response.write ("Unauthorized")
            return

        query = User.query ()
        if 'name' in self.request.GET.keys ():
            name = self.request.GET['name']
            if name != '':
                query = query.filter (User.name == name) 

        if 'email' in self.request.GET.keys ():
            email = self.request.GET['email']
            if email != '':
                query = query.filter (User.email == email)

        if 'user_id' in self.request.GET.keys ():    
            uid = self.request.GET['user_id']
            if uid != '':
                query = query.filter (User.user_id == uid)


        limit = self.request.get ('limit', None)
        if limit is None:
            limit = ProfilesHandler.max_limit

        cursor = ndb.Cursor (urlsafe=self.request.get ('cursor'))

        users, cursor, more = query.fetch_page (int (limit), start_cursor=cursor)

        users_arr = []

        for each in users:
            u = self.__build_user (each)
            users_arr.append (u)

        safe_cursor = ''
        if cursor:
            safe_cursor = cursor.urlsafe ()

        resp_obj = {
            "users": users_arr,
            "cursor": safe_cursor,
            "more": more
        }

        resp = json.dumps (resp_obj)
        self.response.write (resp)
Ejemplo n.º 2
0
    def get (self):
        
        tool_user, db_user = ADayThere.tool_user ()

        if not ADayThere.admin_user (db_user):
            self.response.status = 401
            self.response.write ("Unauthorized")
            return

        query = Day.query ()
        if 'name' in self.request.GET.keys ():
            name = self.request.GET['name']
            if name != '':
                query = query.filter (Day.name == name) 

        if 'title' in self.request.GET.keys ():
            title = self.request.GET['title']
            if title != '':
                query = query.filter (Day.title == title)

        if 'locale' in self.request.GET.keys ():    
            locale = self.request.GET['locale']
            if locale != '':
                query = query.filter (Day.full_locality == locale)

        limit = self.request.get ('limit', None)
        if limit is None:
            limit = DaysHandler.max_limit

        cursor = ndb.Cursor (urlsafe=self.request.get ('cursor'))

        days, cursor, more = query.fetch_page (int (limit), start_cursor=cursor)

        days_arr = []

        for each in days:
            d = self.__build_day (each)
            days_arr.append (d)

        safe_cursor = ''
        if cursor:
            safe_cursor = cursor.urlsafe ()

        resp_obj = {
            "days": days_arr,
            "cursor": safe_cursor,
            "more": more
        }

        resp = json.dumps (resp_obj)
        self.response.write (resp)
Ejemplo n.º 3
0
    def __init__(self, db_user):
        admin_menu = ""

        tool_user, holder = ADayThere.tool_user()

        if ADayThere.admin_user(db_user):
            admin_menu = """
                <li class="dropdown" ng-controller="adminCtrl">
                    <a href="/admin" class="dropdown-toggle">
                        Admin
                    </a>
                    <ul class="dropdown-menu adt-nav-menu-button">
                        <a href="/admin?type=profiles">profiles</a>
                        <a href="/admin?type=days">days</a>
                    </ul>
                </li>
            """

        self.html = """
            <li class="dropdown" ng-controller="loginCtrl">
                <a href ng-click="googlelogout()" class="dropdown-toggle">
                    Logout
                </a>
            </li>
            <li class="dropdown" ng-controller="profileCtrl">
                <a href class="dropdown-toggle" id="profile_ctrl_menu_toggle">
                    {0}
                </a>
                <ul id="tool_user_related_menu" class="dropdown-menu adt-nav-menu-button">
        """.format(
            db_user.name
        )

        if tool_user:
            self.html += LoggedInNavView.tool_user_menus()
        else:
            self.html += LoggedInNavView.non_tool_user_menus()

        self.html += """
                </ul>
            </li>
                {0}
                {1}
                {2}
            <a href popover-placement="bottom" popover-trigger="mouseenter" popover="Click links to see drop down menus">?</a>
        """.format(
            get_help_menu(), get_contact_menu(), admin_menu
        )
Ejemplo n.º 4
0
    def put (self):

        logged_in, db_user = ADayThere.logged_in_user ()

        if not logged_in:
            self.response.status = 401
            return

        operation = self.request.get ("operation")

        if operation == 'add_tool_access':
            if db_user is not None and db_user.has_tool_access:
                return

            print "TOOL ACCESS FOR:", db_user
            db_user.has_tool_access = True
            db_user.date_agreed_to_tool_access = datetime.datetime.utcnow ()
            name = self.request.get ('name', None)
            if name is not None:
                db_user.name = name

            db_user.put ()

            res = {
                "name": name,
                "menu": LoggedInNavView.tool_user_menus ()
            }
            self.response.status = 200
            self.response.write (json.dumps (res))
Ejemplo n.º 5
0
    def delete(self):

        tool_user, db_user = ADayThere.tool_user()
        if not tool_user:
            self.response.status = 401
            return

        title = self.request.get("title")
        day = Day.query_user_title(db_user.user_id, title).get()

        for photo in day.photos:
            photo_query = Photos.query_photo(db_user.user_id, photo.title)
            pq = photo_query.get()
            try:
                index = pq.index(day.title)
                day.title.pop(index)
            except:
                pass

            pq.key.delete()

        day.key.delete()

        KeywordsDayList.delete_keywords(day)

        Words.delete_words(day.key)

        self.response.status = 200
Ejemplo n.º 6
0
    def __init__(self, request, response):
        self.initialize(request, response)
        
        locale = self.request.GET.get ('locale', 'en_US')
        i18n.get_i18n ().set_locale (locale)

        self.user = users.get_current_user ()

        self.adaythere = ADayThere ()
        self.adaythere.add_meta_tags ([
            { "charset":"UTF-8" },
            { "http-equiv":"X-UA-Compatible", "content":"IE=edge" },
            { "name":"description", "content":"A social media site that celebrates the joys of place." },
            { "name":"viewport", "content":"initial-scale=1"}
        ])

        self.adaythere.add_links ([
            { "rel":"stylesheet", "href":"css/bootstrap.css" },
            { "rel":"stylesheet", "href":"css/adaythere.css" }
        ])


        maps = Maps ()

        self.adaythere.add_script_tags_for_body ([
            { "src":"js/jquery-1.11.0-beta2.js" },
            { "src":"js/angular/angular.min.js" },
            { "src":"js/angular/angular-route.min.js" },
            { "src":"js/ui-bootstrap-tpls-0.10.0.min.js" },
            { "src": maps.get_script_src () },
            { "src":"js/adaythere.js" },
            { "src":"https://apis.google.com/js/platform.js", "async":None, "defer":None }
        ])
Ejemplo n.º 7
0
    def post (self):

        logged_in, db_user = ADayThere.logged_in_user ()

        if not logged_in:
            self.response.status = 401
            return

        name = self.request.get ('name', None)
        matched = re.match ("^[a-z0-9_]+$", name, re.IGNORECASE)

        if name is None or matched is None:
            self.response,status = 400
            self.response.write ("Valid name required")
            return

        response = db_user.update_username (name)

        if response == False:
            self.response.status = 409
            self.response.write (' name is in use ')
            return
       
        self.response.status = 200
        self.response.write (name)
Ejemplo n.º 8
0
    def post(self):

        tool_user, db_user = ADayThere.tool_user()
        if not tool_user:
            self.response.status = 401
            return

        data = json.loads(self.request.body)

        day = Day.query_user_title(db_user.user_id, data["title"]).get()

        KeywordsDayList.delete_keywords(day)

        day.full_locality = data["full_locality"]
        day.title = data["title"]
        day.description = data["description"]

        if isinstance(data["keywords"], basestring):
            if "," in data["keywords"]:
                day.keywords = data["keywords"].split(",")
            else:
                day.keywords = data["keywords"].split(" ")
        else:
            day.keywords = data["keywords"]

        for keyword in day.keywords:
            Keywords.add_if_missing(keyword)

        day.places = []
        for place in data["places"]:
            p = Place()
            p.name = place["name"]
            p.comment = place["comment"]
            p.location = Location()
            p.location.latitude = str(place["location"]["latitude"])
            p.location.longitude = str(place["location"]["longitude"])
            p.location.vicinity = place["vicinity"]
            day.places.append(p)

        day.photos = []
        for photo in data["photos"]:
            day_photo = DayPhoto()
            day_photo.title = photo["title"]
            day_photo.description = photo["description"]

            day.photos.append(day_photo)

            photo_query = Photos.query_photo(db_user.user_id, photo["title"])
            pq = photo_query.get()
            cnt = pq.used_by.count(day.title)
            if cnt == 0:
                pq.used_by.append(day.title)

        day.put()

        KeywordsDayList.add_keywords(day)

        Words.update_words(day.title, day.description, day.key, day.full_locality)

        self.response.status = 200
Ejemplo n.º 9
0
    def get (self):

        tool_user, db_user = ADayThere.tool_user ()
        if not tool_user:
            self.response.status = 401
            return

        action = self.request.get ('action');

        if action is None:
            self.response.status = 401
            return

        if (action == 'count'):
            count = 0
            query = Photos.query_user_id (db_user.user_id)
            if query is not None:
                count = query.count ()

            res = json.dumps ({ "count": count })
            self.response.write (res)
            return
        
        elif (action == 'img'):
            title = self.request.get ('title', None)
            if title is None:
                self.response.status = 401
                return

            photo_query = Photos.query_photo (db_user.user_id, title)
            photo = photo_query.get ()
            
            if photo is None:
                self.response.status = 404
                return

            self.response.headers['Content-Type'] = 'image/png'
            self.response.write (photo.photo)
            return

        elif (action == 'list'):
            list_query = Photos.query_user_id (db_user.user_id)
            
            if list_query is None:
                self.response.status = 404
                return

            titles = []
            photos = list_query.fetch ()
            for photo in photos:
                d = {}
                d['title'] = photo.title;
                d['used_by'] = photo.used_by;
                titles.append (d)

            self.response.write (json.dumps (titles))
            return
Ejemplo n.º 10
0
    def put (self):
        logged_in_user, commenters_id = ADayThere.tool_user ()
       
        if not logged_in_user:
            self.response.status = 401
            return

        data = json.loads (self.request.body)

        print "DATA", data

        userid = data.get ('userid', None)
        title = data.get ('title', None)
        review = data.get ('rating', 1)

        if title is None or userid is None:
            self.response.status = 401
            return
            

        
        prev_comment = UserComment.query_previous_comment (commenters_id.name, userid, title).get ()

        if prev_comment is not None:
            self.response.status = 409
            self.response.write (json.dumps ({'rating': prev_comment.rating, 'title': prev_comment.title}))
            return

        day = Day.query_user_title (userid, title).get ()

        if day is None:
            self.response.status = 403
            return


        new_comment = UserComment ()
        new_comment.commenters_name = commenters_id.name
        new_comment.userid = userid
        new_comment.title = title
        new_comment.text = data.get ('text', None)
        new_comment.rating = review

        new_comment.put ()
        
        if day.numberOfReviews == None or day.numberOfReviews == 0:
            day.numberOfReviews = 1;
            day.averageReview = review;
        else:
            rev = (day.numberOfReviews * day.averageReview) + review
            day.numberOfReviews = day.numberOfReviews + 1
            day.averageReview = rev / day.numberOfReviews

        day.put ()

        self.response.write (json.dumps ({'numberOfReviews': day.numberOfReviews, 'averageReview': day.averageReview, 'review': new_comment.to_dict ()}));

        self.response.status = 200
Ejemplo n.º 11
0
    def get (self):
        """
            Responds to a get request.
        """

        logged_in, db_user = ADayThere.logged_in_user ()
        if not logged_in:
            self.response.status = 401
            return

        res = self.__build_response (db_user)
        self.response.write (json.dumps (res))
Ejemplo n.º 12
0
    def post (self):
        
        tool_user, db_user = ADayThere.tool_user ()

        if not ADayThere.admin_user (db_user):
            self.response.status = 401 
            self.response.write ("Unauthorized")
            return

        sent_day = json.loads (self.request.body)
    
        day_query = Day.query_user_title (sent_day['userid'], sent_day['title'])
        day = day_query.get ()
        if day is None:
            self.response.status = 404
            self.response.write ("Not Found")
            return

        day.key.delete ()

        self.response.status = 200
        self.response.write ("OK")
Ejemplo n.º 13
0
    def post (self):
        
        tool_user, db_user = ADayThere.tool_user ()

        if not tool_user or not ADayThere.admin_user (db_user):
            self.response.status = 401 
            self.response.write ("Unauthorized")
            return

        user = json.loads (self.request.body)
        record = User.query_user_id (user['user_id'])
        
        if 'type' not in self.request.GET.keys ():
            self.response.status = 400
        else:
            tp = self.request.GET['type']
            if tp == 'ban':
                record.banned = user['banned']
                record.put ()
                self.response.status = 200
            else:
                self.response.status = 400
Ejemplo n.º 14
0
    def get(self):

        tool_user, db_user = ADayThere.tool_user()
        if not tool_user:
            self.response.status = 401
            return

        days = []
        data = Day.query_user(db_user.user_id).fetch()

        for each in data:
            days.append(json.dumps(each.to_dict()))

        self.response.write(json.dumps(days))
Ejemplo n.º 15
0
    def get (self):

        logged_in_user, commenters_id = ADayThere.tool_user ()

        userid = self.request.get ('userid', None)
        title = self.request.get ('title', None)
        limit = self.request.get ('limit', 20)
        cursor = self.request.get ('cursor', None)

        if title is None or userid is None:
            self.response.status = 401
            return


        json_comments = []

        if commenters_id is not None:
            prev_comment = UserComment.query_previous_comment (commenters_id.name, userid, title).get ()
            if prev_comment is not None:
                json_comments.append (json.dumps (prev_comment.to_dict ()))
        
        comments_query = UserComment.query_comments (userid, title) 

        if cursor is not None:
            comments, cursor, more = comments_query.fetch_page (limit, start_cursor = cursor)
        else:
            comments, cursor, more = comments_query.fetch_page (limit)

        for each in comments:
            if prev_comment is None or each.commenters_name != prev_comment.commenters_name:
                json_comments.append (json.dumps (each.to_dict ()))

        return_vals= {
            'comments': json_comments,
            'cursor': None,
            'more': more
        };

        if cursor is not None:
            return_vals['cursor'] = cursor.urlsafe()

        self.response.write (json.dumps (return_vals))
        if prev_comment is not None:
            self.response.status = 201
        else:
            self.response.status = 200
Ejemplo n.º 16
0
    def post (self):

        logged_in, user = ADayThere.logged_in_user ()
        if not logged_in:
            self.response.status = 401
            return
        
        location = json.loads (self.request.body)
        logging.info (location)
        db_location = Location ()
        db_location.latitude = str (location["location"]["latitude"])
        db_location.longitude = str (location["location"]["longitude"])
        db_location.locality = location["location"]["locality"]
        db_location.vicinity = location["location"]["vicinity"]
        db_user.location = db_location
        db_user.put ()
        
        res = self.__build_response (db_user)
        self.response.write (json.dumps (res))
Ejemplo n.º 17
0
    def put (self):

        tool_user, db_user = ADayThere.tool_user ()
        if not tool_user:
            self.response.status = 401
            return

        data = self.request.body
        lst = json.loads (data)
        entities = []
        for p in lst:
            photo = Photos ()
            photo.user_id = db_user.user_id
            photo.title = p['title']
            decoded = p['url'].decode ('base64')
            photo.photo = decoded
            entities.append (photo)
        
        ndb.put_multi (entities)
        
        self.response.status = 200
Ejemplo n.º 18
0
    def delete (self):

        tool_user, db_user = ADayThere.tool_user ()
        if not tool_user:
            self.response.status = 401
            return

        titlestr = self.request.get ("titles", None)
        used_by = self.request.get ("used_by", None)
        if titlestr is None:
            self.response.status = 401
            return 

        titles = titlestr.split (",")

        if used_by is not None:
            photos = Photos.query (Photos.user_id == db_user.user_id, Photos.title.IN (titles), Photos.used_by == used_by).fetch (keys_only=True)
        else:
            photos = Photos.query (Photos.user_id == db_user.user_id, Photos.title.IN (titles)).fetch (keys_only=True)

        ndb.delete_multi (photos)
Ejemplo n.º 19
0
    def get (self):

        logged_in, db_user = ADayThere.logged_in_user ()

        if not logged_in:
            self.response.status = 401
            return

        name = self.request.get ('name', None)
        if name is None:
            self.response,status = 400
            self.response.write ("Name required")
            return 

        user = User.query_name (name)

        self.response.status = 200
        if user is not None:
            self.response.write ('not available')
        else:
            self.response.write ('available')
Ejemplo n.º 20
0
    def __init__ (self):

        super (BecomeAContributorModal, self).__init__ ("becomeAContributorModalContent.html")

        logged_in, db_user = ADayThere.logged_in_user ()
        body_html = ""
        if logged_in:
            suggest_change = ""
            if db_user.name == db_user.email:
                suggest_change = """*Please, change your user name to something other then your email address to avoid spam.
                                Only alphanumeric characters and the underscore (_) are accepted."""

            if not logged_in:
                body_html += "You must be logged in through Google before becoming a contributor"
            else:
                body_html += """
                    <div>Thanks for choosing to become a contributor to the community. We ask that you don't use language that would make
                        anyone's Grandmother blush. Be repectful of others who use "A Day There". By clicking the OK button you agree
                        to allow "A Day There" to use the material you contribute and to abide by the rules.<br/><br/>
                        Thank You!<br/>
                    </div>
                    <div id="contributor_name_choice" style="color:red;">{0}</div>
                    <label for="contribute_google_nickname">Name:</label> 
                    <input data-warning-id="contributor_name_choice" id="contribute_google_nickname" class="form-control" type='text' contributor-user-name value="{1}"></input>
                    <input id="contribute_gotto_tools" type="checkbox">Go to create tools</input>
                """.format (suggest_change, db_user.name)

        modalHeader = Elements ()
        modalHeader.append_to_element ("""
            <h3>Become A Contributor</h3>
        """)
        self.add_header_content (modalHeader)
        modalBody = Elements ()
        modalBody.append_to_element (body_html)
        self.add_body_content (modalBody)
        modalFooter = Elements ()
        modalFooter.append_to_element ("""
            <button class="btn btn-primary" ng-click="contribute_modal_ok ()">OK</button>
            <button class="btn btn-warning" ng-click="contribute_modal_cancel ()">Cancel</button>""")
        self.add_footer_content (modalFooter)
Ejemplo n.º 21
0
    def get (self):
        tool_user, db_user = ADayThere.tool_user ()

        if not ADayThere.admin_user (db_user):
            self.response.status = 401
            self.response.write ("Unauthorized")
            return

        adaythere = ADayThere ()
        adaythere.add_meta_tags ([
            { "charset":"UTF-8" },
            { "http-equiv":"X-UA-Compatible", "content":"IE=edge" },
            { "name":"viewport", "content":"initial-scale=1"}
        ])

        adaythere.add_links ([
            { "rel":"stylesheet", "href":"css/bootstrap.css" },
            { "rel":"stylesheet", "href":"css/adaythere.css" }
        ])
        
        adaythere.add_script_tags_for_body ([
            { "src":"js/jquery-1.11.0-beta2.js" },
            { "src":"js/angular/angular.min.js" },
            { "src":"js/angular/angular-route.min.js" },
            { "src":"js/ui-bootstrap-tpls-0.10.0.min.js" },
            { "src":"js/adaythere.js" }
        ])

        
        adaythere.open_element ("header", {"id":"page_header"})
        adaythere.open_element ("h1", {"id":"page_heading"}, "A Day There - Administration Page")
        adaythere.close_element ("h1")
        adaythere.open_element ("nav")
        adaythere.append_to_element ("")
        adaythere.close_element ("nav")
        adaythere.close_element ("header")

        adaythere.open_element ("section", {"ng-controller":"adminCtrl", "style":"width:600px;margin:0px auto;"})

        adaythere.open_element ("div", {"id":"admin_profile_div"})

        type = self.request.get ('type', default_value=None)

        if type is not None:
            if type == 'profiles':
                self.get_profile_form (adaythere)
            elif type == 'days':
                self.get_days_form (adaythere)

        adaythere.close_element ("div")

        adaythere.close_element ("section")

        adaythere.open_element ("footer", {"id":"page_footer"})
        adaythere.open_element ("p", None, "&copy; 2014 SoftSprocket")
        adaythere.close_element ("p")
        adaythere.close_element ("footer")

        self.response.status = 200
        self.response.write (adaythere.get ())
Ejemplo n.º 22
0
class ToolsHandler (webapp2.RequestHandler):
    def __init__(self, request, response):
        self.initialize(request, response)
        
        locale = self.request.GET.get ('locale', 'en_US')
        i18n.get_i18n ().set_locale (locale)

        self.user = users.get_current_user ()

        self.adaythere = ADayThere ()
        self.adaythere.add_meta_tags ([
            { "charset":"UTF-8" },
            { "http-equiv":"X-UA-Compatible", "content":"IE=edge" },
            { "name":"description", "content":"A social media site that celebrates the joys of place." },
            { "name":"viewport", "content":"initial-scale=1"}
        ])

        self.adaythere.add_links ([
            { "rel":"stylesheet", "href":"css/bootstrap.css" },
            { "rel":"stylesheet", "href":"css/adaythere.css" }
        ])


        maps = Maps ()

        self.adaythere.add_script_tags_for_body ([
            { "src":"js/jquery-1.11.0-beta2.js" },
            { "src":"js/angular/angular.min.js" },
            { "src":"js/angular/angular-route.min.js" },
            { "src":"js/ui-bootstrap-tpls-0.10.0.min.js" },
            { "src": maps.get_script_src () },
            { "src":"js/adaythere.js" },
            { "src":"https://apis.google.com/js/platform.js", "async":None, "defer":None }
        ])


    def get (self):
        """
            Check and see if the user is logged in through
            google. If so set up logged in view else
            setup not logged in view.
        """


        db_user = None
        navView = None
        logged_in = False
        if self.user is None:
            navView = LoggedOutNavView ()
        else:
            db_user = User.query_user_id (str (self.user.user_id ()))

            if db_user is None:
                db_user = User.record_from_google_user (self.user)

            if db_user.banned:
                navView = LoggedOutNavView ()
            else:
                navView = LoggedInNavView (db_user)
                logged_in = True

            
        adminProfileModal = AdminProfileModal ()
        contributorModal = BecomeAContributorModal ()
        
        sidebar_display = """
                <li id="sidebar_display_menu_item" ng-controller="sidebarDisplayCtrl" style="list-style:none; position:absolute; right:10px; top:5px">
                    <a href ng-show="sidebar_link.map_is_displayed" ng-click="toggle_sidebar ()">
                    {{ sidebar_display.menu_text }}
                    </a>
                </li>
        """

        self.adaythere.open_element ("header", {"id":"page_header"})
        self.adaythere.open_element ("h1", {"id":"page_heading"}, "A Day There")
        self.adaythere.close_element ("h1")
        self.adaythere.open_element ("nav")
        self.adaythere.append_to_element (navView.get ())
        self.adaythere.close_element ("nav")
        self.adaythere.open_element ("div")
        self.adaythere.append_to_element (adminProfileModal.get ())
        self.adaythere.close_element ("div")
        self.adaythere.open_element ("div")
        self.adaythere.append_to_element (contributorModal.get ())
        self.adaythere.close_element ("div")
        self.adaythere.append_to_element (sidebar_display)
        self.adaythere.close_element ("header")

        self.adaythere.open_element ("div", { "ng-controller":"daysSearchCtrl"})
        
        self.adaythere.open_element ("section", { "id":"welcome_to_left" })
        self.adaythere.append_to_element ("""
                    <img src="img/logo.png" width="60%"></img>
                    <p><h1 style="font-style:italic;text-align:center;font-size:large;">Celebrating the joys of place.</h3></p>
                """)
        self.adaythere.close_element ("section")
        
        self.adaythere.open_element ("section", { "id":"welcome_to_right" })
        self.adaythere.append_to_element ("""<div id="google_like_main" style="float:right;"> <div class="g-plusone" data-size="medium" data-annotation="inline" data-width="250"></div></div>""")
        self.adaythere.close_element ("section")

        self.adaythere.open_element ("section", { "id": "daysearch_overlay" })
        day_search = DaySearch ()
        search_form = day_search.get ()
        self.adaythere.append_to_element (search_form)
        self.adaythere.close_element ("section")


        self.adaythere.open_element ("section", { "id":"find_a_day" })

        self.adaythere.append_to_element ("""
                    <img src="img/logo.png" width="30%"></img>
                    <p><h1 style="font-style:italic;text-align:center;font-size:large;">Celebrating the joys of place.</h3></p>
                """)

        self.adaythere.append_to_element (day_search.get_days_display ())
        self.adaythere.close_element ("section")
    
        self.adaythere.close_element ("div")

        self.adaythere.append_to_element (MapTools.map_elements (logged_in).get ())

        self.adaythere.open_element ("div", { "id":"hello_login_popup" })
        self.adaythere.append_to_element ("""
            <h3>Click the link above to login</h3>
            <p>The white bar is a menu bar and the links drop down menus. Login for more functionality"</p>
        """)
        self.adaythere.close_element ("div")
        self.adaythere.open_element ("div", { "id":"hello_search_popup" })
        self.adaythere.append_to_element ("""
            <h3>The search tools</h3>
            <p>The search tools let you find days that have been created. Login to create your own days.</p>
        """)
        self.adaythere.close_element ("div")
        self.adaythere.open_element ("div", { "id":"hello_help_popup" })
        self.adaythere.append_to_element ("""
            <h3>Help</h3>
            <p>Use the help link in the menu. You'll also find these: <a href popover="Welcome to A Day There" popover-trigger="mouseenter"><strong>?</strong></a> 
            in places and if you place your mouse cursor over them some information will popup."</p>
        """)
        self.adaythere.close_element ("div")
        self.adaythere.open_element ("footer", {"id":"page_footer"})
        self.adaythere.open_element ("p", None, "&copy; 2014 SoftSprocket")
        self.adaythere.close_element ("p")
        self.adaythere.close_element ("footer")

        self.response.write (self.adaythere.get ())