Example #1
0
 def update_personal(self):
     user = self.request.user
     form = Form(self.request, schema=PersonalSchema, obj=user)
     if 'personal_submitted' in self.request.POST and form.validate():
         form.bind(user)
         DBSession.add(user)
         if form.data['prefix'] and form.data['prefix'] != user.prefix:
             user.prefix = create_path(form.data['prefix'], is_unique)
         DBSession.flush()
         if self.request.is_xhr:
             html = """<div class="alert alert-success alert-dismissable col-xs-12">
                         <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                         Update Successful
                         </div>"""
             return Response(html)
         self.request.session.flash("success; Update successful")
         return HTTPFound(location=self.request.route_url("user_edit"))
     if self.request.is_xhr:
         html = """<div class="alert alert-danger alert-dismissable col-xs-12">
                     <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                     Update Not Successful
                     </div>"""
         return Response(html)
     self.request.session.flash("success; Update successful")
     return HTTPFound(location=self.request.route_url("user_edit"))
Example #2
0
 def ratings(self):
     form = Form(self.request, schema=UserRatingSchema)
     prefix = self.request.matchdict['prefix']
     user = Users.get_by_path(prefix)
     title = 'Rate ' + user.fullname
     if 'form_submitted' in self.request.POST and form.validate():
         if user.id == self.request.user.id:
             self.request.session.flash("danger; You can't rate yourself")
             return HTTPFound(
                 location=self.request.route_url('profile', prefix=prefix))
         if user.rating:
             for rating in user.rating:
                 if rating.rater_id == self.request.user.id:
                     self.request.session.flash(
                         "warning; You have rated %s before" %
                         user.fullname)
                     return HTTPFound(location=self.request.route_url(
                         'profile', prefix=prefix))
         rating = UserRating(rater_id=self.request.user.id,
                             rated_id=user.id,
                             rating=form.data['rating'],
                             review=form.data['review'])
         DBSession.add(rating)
         DBSession.flush()
         self.request.session.flash("success; Success")
         return HTTPFound(
             location=self.request.route_url('profile', prefix=prefix))
     self.request.session.flash("danger; An Error occured")
     return HTTPFound(
         location=self.request.route_url('profile', prefix=prefix))
Example #3
0
def populate_userTypes():
        usertypes = [u'Buyer/Seller',u'Real Estate Developer/Builder',u'Real Estate Agent',u'Mortgage Lender',u'LandLord',
                     u'Real Estate Broker',u'Property Manager',u'Other/just Looking']
        with transaction.manager:
                for name in usertypes:
                        typs = User_types(
                                name)
                        DBSession.add(typs)
Example #4
0
def listplans(request):
    plans = DBSession.query(Plans).order_by(Plans.id).all()
    form = Form(request, schema=PlanSchema())
    if 'form_submitted' in request.POST and form.validate():
        plan = form.bind(Plans())
        DBSession.add(plan)
        DBSession.flush()
        return HTTPFound(location=request.route_url('list_plans'))
    return dict(form=FormRenderer(form), plans=plans, title="List of plans")
Example #5
0
    def reg(self):
        title = 'Registration'
        usertypes = userTypes()
        states = get_states()
        msg = ''
        form = Form(self.request, schema=Registration)
        if 'form_submitted' in self.request.POST and form.validate():
            try:
                resp = self.request.POST['g-recaptcha-response']
            except:
                self.request.session.flash(
                    'danger; Failed captcha due to slow network')
                return HTTPFound(location=self.request.route_url('reg'))
            recaptcha_r = requests.post(
                recaptcha_endpoint,
                dict(secret=buddy_settings('recaptcha_secret'), response=resp))
            rdata = recaptcha_r.json()
            if rdata:
                if not rdata['success']:
                    msg = 'Failed recaptcha, please solve again'
                    return dict(form=FormRenderer(form),
                                msg=msg,
                                title=title,
                                usertypes=usertypes,
                                states=states)

            user = form.bind(Users())
            if 'ref_email' in self.request.session:
                referrer = Users.get_by_email(
                    self.request.session['ref_email'])
                if referrer:
                    user.parent_id = referrer.id
            with transaction.manager:
                DBSession.add(user)
                user.prefix = create_path(user.user_fullname, is_unique)
                DBSession.flush()
                timestamp = time.time() + 3600
                hmac_key = hmac.new(
                    '%s:%s:%d' %
                    (str(user.id), 'r5$55g35%4#$:l3#24&', timestamp),
                    user.email).hexdigest()[0:10]
                time_key = base64.urlsafe_b64encode('%d' % timestamp)
                email_hash = '%s%s' % (hmac_key, time_key)
                user_regmail(self.request, user.id, user.email, email_hash)
                headers = buddy_remember(self.request, user, event='R')
                self.session.flash(
                    "success;You should be receiving an email with a link to activate your "
                    "account within 10 minutes. Doing so will let you post properties/blog on this website."
                )
                return HTTPFound(location=self.request.route_url('account'),
                                 headers=headers)

        return dict(form=FormRenderer(form),
                    title=title,
                    usertypes=usertypes,
                    msg=msg,
                    states=states)
Example #6
0
def populate_location():
        states=[u"Abuja",u"Abia",u"Anambra",u"Adamawa",u"Akwa Ibom",u"Bauchi",u"Benue",
         u"Bayelsa",u"Borno",u"Cross River",u"Enugu",u"Ebonyi",u"Edo",u"Ekiti",u"Delta",
         u"Gombe",u"Imo",u"Jigawa",u"Kebbi",u"Kogi",u"Kwara",u"Kano",u"Kaduna",u"Katsina",
         u"Lagos",u"Nasarawa",u"Niger",u"Osun",u"Ogun",u"Oyo",u"Ondo",u"Rivers",u"Plateau",
         u"Taraba",u"Sokoto",u"Yobe",u"Zamfara"]
        with transaction.manager:
                for state in states:
                        s = State(state)
                        DBSession.add(s)
Example #7
0
def editplans(request):
    pid = request.matchdict.get('id')
    plan = DBSession.query(Plans).get(pid)
    form = Form(request, schema=PlanSchema(), obj=plan)
    if 'form_submitted' in request.POST and form.validate():
        form.bind(plan)
        DBSession.add(plan)
        DBSession.flush()
        return HTTPFound(location=request.route_url('list_plans'))
    return dict(form=FormRenderer(form), plan=plan, title=plan.name + " Edit")
Example #8
0
    def edit_blog(self):
        from buddy.models.properties_model import State

        def get_states():
            query = [(s.id, s.name) for s in DBSession.query(State).all()]
            return query

        name = self.request.matchdict['name']
        categories = get_categories()
        blog = Blogs.get_by_name(name)
        if not blog:
            self.session.flash("danger; No such blog post")
            return HTTPFound(location=self.request.route_url('blog_list'))
        title = "Editing " + blog.title
        form = Form(self.request, schema=BlogPost, obj=blog)
        if "form_submitted" in self.request.POST and form.validate():
            form.bind(blog, exclude=['category_id'])
            for i, cat in enumerate(blog.categories):
                if cat.id not in form.data['category_id']:
                    del blog.categories[i]
            catids = [cat.id for cat in blog.categories]
            for cate in form.data['category_id']:
                if cate not in catids:
                    t = DBSession.query(BlogCategory).get(cate)
                    blog.categories.append(t)
            blog.status = True
            DBSession.add(blog)
            DBSession.flush()
            return HTTPFound(
                location=self.request.route_url('blog_view', name=blog.name))
        elif "draft" in self.request.POST and form.validate():
            form.bind(blog, exclude=['category_id'])
            for i, cat in enumerate(blog.categories):
                if cat.id not in form.data['category_id']:
                    del blog.categories[i]
            catids = [cat.id for cat in blog.categories]
            for cate in form.data['category_id']:
                if cate not in catids:
                    t = DBSession.query(BlogCategory).get(cate)
                    blog.categories.append(t)
            blog.status = 0
            DBSession.add(blog)
            DBSession.flush()
            return HTTPFound(
                location=self.request.route_url('blog_view', name=blog.name))

        return {
            'form': FormRenderer(form),
            'blog_nav_cat': get_navcategories(),
            'title': title,
            'categories': categories,
            'blog': blog,
            'wb': 'wb',
            'states': get_states()
        }
Example #9
0
def add_g(request):
    title = 'Add group'
    groups = DBSession.query(Groups).all()
    form = Form(request, schema=AddGroup)
    if 'form_submitted' in request.POST and form.validate():
        group = form.bind(Groups())
        DBSession.add(group)
        DBSession.flush()
        redir_url = request.route_url('dashboard')
        return HTTPFound(location=redir_url)
    return dict(form=FormRenderer(form), groups=groups, title=title)
Example #10
0
def buddy_remember(request, user, event='L'):
    if asbool(buddy_settings('log_logins')):
        if buddy_settings('log_login_header'):
            ip_addr = request.environ.get(
                buddy_settings('log_login_header'),
                u'invalid value - buddy.log_login_header')
        else:
            ip_addr = unicode(request.environ['REMOTE_ADDR'])
        record = AuthUserLog(user_id=user.id, ip_addr=ip_addr, event=event)
        DBSession.add(record)
        DBSession.flush()
        return remember(request, user.id)
    return remember(request, user.id)
Example #11
0
def verify(request):
    prefix = request.matchdict['prefix']
    user = Users.get_by_path(prefix)
    if not user:
        request.session.flash('danger; user not found')
    user.is_verified = True
    user_parent = user.parent
    silver_plan = DBSession.query(Plans).filter(Plans.name == 'Silver').first()
    if user_parent:
        if not user_parent.earned_benefit:
            if user.active_subscription:
                active_sub = user.active_subscription[0]
                subscription = Subscription(user=user,
                                            plan=silver_plan,
                                            amount=0,
                                            no_of_months=1,
                                            discount=u"100%",
                                            status=u"Active")
                subscription.start_date = active_sub.end_date
                subscription.end_date = active_sub.end_date + timedelta(
                    days=30)
            else:
                subscription = Subscription(user=request.user,
                                            plan=silver_plan,
                                            amount=0,
                                            no_of_months=1,
                                            discount=u"100%",
                                            start_date=datetime.today(),
                                            end_date=datetime.today() +
                                            timedelta(days=30),
                                            status=u"Active")
            DBSession.add(subscription)
            DBSession.flush()
    body = """<html><head><title>Verified on nairabricks.com</title></head><body>
            <p>Dear %s,<p><br>
            <p>You are now verified as a professional in Nairabricks</p>
            <p>However, please note that we still have the right to decline your listings if they violate our property listing policy</p>
            <p>Moreso, ensure that your listings are not duplicated.
            Instead of having duplicate listings, update your listing frequently to keep it at the top</p>
            <p>Yours sincerely,</p>
            <p>The Happy Nairabricks Info Robot</p>
            </body>
            </html>
            """ % user.fullname

    html_email_sender(request,
                      subject="Congratulations",
                      recipients=user.email,
                      body=body)
    request.session.flash('success; user verified')
    return HTTPFound(location=request.route_url('user_list'))
Example #12
0
def promo_sub(request):
    id = request.matchdict['id']
    user = Users.get_by_id(id)
    if not user:
        return HTTPNotFound()
    form = Form(request, schema=PromoSubSchema)
    if 'submit' in request.POST and form.validate():
        plan_id = form.data['plan']
        plan = DBSession.query(Plans).get(plan_id)
        if plan:
            subscription = Subscription(user=user,
                                        plan=plan,
                                        amount=0,
                                        no_of_months=1,
                                        discount="100%",
                                        status="Active",
                                        start_date=datetime.today(),
                                        end_date=datetime.today() +
                                        timedelta(days=30))
            DBSession.add(subscription)
            DBSession.flush()
            if request.is_xhr:
                html = """<div class="alert alert-success alert-dismissable col-xs-12">
                            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                            User subscription
                            </div>"""
                return Response(html)
            request.session.flash('success; User subscribed')
            return HTTPFound(
                location=request.route_url('profile', prefix=user.prefix))
        if request.is_xhr:
            html = """<div class="alert alert-danger alert-dismissable col-xs-12">
                        <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                        An error occured, user Not subscribed
                        </div>"""
            return Response(html)
        request.session.flash('danger; An error occured, user subscribed %s' %
                              form.all_errors())
        return HTTPFound(
            location=request.route_url('profile', prefix=user.prefix))
    if request.is_xhr:
        html = """<div class="alert alert-danger alert-dismissable col-xs-12">
                    <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                    An error occured, user Not subscribed
                    </div>"""
        return Response(html)
    request.session.flash('danger; An error occured, user subscribed %s' %
                          form.all_errors())
    return HTTPFound(location=request.route_url('profile', prefix=user.prefix))
Example #13
0
def listing_category_edit(request):
    """listing category edit """
    title = 'Edit listing category'
    id = request.matchdict['id']
    dbsession = DBSession()
    category = PropertyCategory.get_by_id(id)
    if category is None:
        request.session.flash("warning; Category not found!")
        return HTTPFound(location=request.route_url("listing_category_list"))
    form = Form(request, schema=BlogCategoryForm, obj=category)
    if "form_submitted" in request.POST and form.validate():
        form.bind(category)
        dbsession.add(category)
        request.session.flash("success;The Category is saved!")
        return HTTPFound(location=request.route_url("listing_category_list"))
    action_url = request.route_url("listing_category_edit", id=id)
    return dict(form=FormRenderer(form), action_url=action_url)
Example #14
0
    def view_p(self):
        name = self.request.matchdict['name']
        listing = Listings.get_by_name(name)
        if not listing:
            self.request.session.flash('warning; Listing not found')
            return HTTPFound(location=self.request.route_url('home'))
        form = Form(self.request)
        files = listing.pictures.all()
        #city = DBSession.query(Locality).filter(Locality.state_id==listing.state_id).\
        #    filter(Locality.city_name==listing.city).first()
        category = listing.property_extra
        '''
        receiver = listing.user.email
        body = """
        <html><head></head><body>
        <p>Dear %s,<p><br>

        <p>A user at Nairabricks viewed your property <a href="%s">%s</a> just now.</p>

        <p>Yours sincerely,</p>
        <p>The Happy Nairabricks Info Robot</p>
        </body>
        </html>
        """%(listing.user.fullname,self.request.route_url('property_view',name=name),listing.serial)
        if not self.request.user==listing.user:
            html_email_sender(self.request,
            subject = "Property Clicks",
            recipients=receiver,
            body = body
        )
        '''
        view_log = Content_Stat(content_id=listing.id, views=1)
        DBSession.add(view_log)
        DBSession.flush()

        return dict(files=files,
                    title=listing.title,
                    form=FormRenderer(form),
                    category=category,
                    listing=listing
                    #, locality=city
                    )
Example #15
0
    def view_blog(self):
        name = self.request.matchdict['name']
        blog = Blogs.get_by_name(name)
        if not blog:
            self.session.flash("danger; No such blog post")
            return HTTPFound(location=self.request.route_url('blog_list'))
        title = blog.title
        bcategor = DBSession.query(Blogs).filter(
            Blogs.user_id == blog.user.id).all()
        bc = [s.categories for s in bcategor]
        bc = histogram(bc)
        view_log = Content_Stat(content_id=blog.id, views=1)
        DBSession.add(view_log)

        DBSession.flush()
        return dict(blog=blog,
                    user=blog.user,
                    title=title,
                    blog_nav_cat=get_navcategories(),
                    bcategories=bc)
Example #16
0
 def abt_update(self):
     user = self.request.user
     form = Form(self.request, schema=NoteSchema, obj=user)
     if "abt_submitted" in self.request.POST and form.validate():
         form.bind(user)
         DBSession.add(user)
         DBSession.flush()
         if self.request.is_xhr:
             html = """<div class="alert alert-success alert-dismissable col-xs-12">
                         <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                         Update Successful
                         </div>"""
             return Response(html)
         self.session.flash("success; Update successful")
         return HTTPFound(location=self.request.route_url("user_edit"))
     if self.request.is_xhr:
         html = """<div class="alert alert-danger alert-dismissable col-xs-12">
                     <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                     Update Not Successful
                     </div>"""
         return Response(html)
     self.session.flash("danger; Update Not successful")
     return HTTPFound(location=self.request.route_url("user_edit"))
Example #17
0
def email_passw(request):
    user = request.user
    form = Form(request, schema=ChangeEmailPassword, obj=user)
    if 'pass_submitted' in request.POST and form.validate():
        form.bind(user)
        DBSession.add(user)
        DBSession.flush()
        if request.is_xhr:
            html = """<div class="alert alert-success alert-dismissable col-xs-12">
                        <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                        Update Successful
                        </div>"""
            return Response(html)
        request.session.flash("success; Email and password saved")
        return HTTPFound(location=request.route_url('account'))
    if request.is_xhr:
        html = """<div class="alert alert-danger alert-dismissable col-xs-12">
                    <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                    Update not Successful {0}
                    </div>""".format(form.all_errors())
        return Response(html)
    request.session.flash("danger; Update not successful")
    return HTTPFound(location=request.route_url('account'))
Example #18
0
def blog_category_add(request):
    title = 'Add blog category'
    parent_categories = DBSession.query(BlogCategory).filter(
        BlogCategory.parent == None).all()
    parent_categories = [(x.id, x.name) for x in parent_categories]
    form = Form(request, schema=BlogCategoryForm)
    if "form_submitted" in request.POST and form.validate():
        #add
        category = BlogCategory(name=form.data['name'],
                                description=form.data['description'],
                                parent=form.data['parent'])
        DBSession.add(category)
        DBSession.flush()
        request.session.flash('success; category saved')
        return HTTPFound(location=request.route_url("blog_category_list"))

    action_url = request.route_url('add_blog_category')
    return {
        'form': FormRenderer(form),
        'title': title,
        'action_url': action_url,
        'parent_categories': parent_categories
    }
Example #19
0
def blog_category_edit(request):

    title = 'Edit blog category'
    id = request.matchdict['id']
    parent_categories = DBSession.query(BlogCategory).filter(
        BlogCategory.parent == None).all()
    parent_categories = [(x.id, x.name) for x in parent_categories]

    category = BlogCategory.get_by_id(id)
    if category is None:
        request.session.flash("warning; Category not found!")
        return HTTPFound(location=request.route_url("blog_category_list"))
    form = Form(request, schema=BlogCategoryForm, obj=category)
    if "form_submitted" in request.POST and form.validate():
        form.bind(category)
        DBSession.add(category)
        request.session.flash("success;The Category is saved!")
        return HTTPFound(location=request.route_url("blog_category_list"))
    action_url = request.route_url("blog_category_edit", id=id)
    return dict(form=FormRenderer(form),
                category=category,
                parent_categories=parent_categories,
                action_url=action_url)
Example #20
0
def populate_features():
        external = Feature_types(u'External Features')
        internal = Feature_types(u'Internal Features')
        eco = Feature_types(u'Eco Features')
        other = Feature_types(u'Other Features')

        oth = [u'Pets Allowed', u'Disability Features',u'Waterfront', u'Water View',
               u'Ocean View', u'River View',u'Hill/Mountain View', u'Development Projects']
        inter = [u'Alarm System', u'Intercom',u'Ensuite', u'Dishwasher',
               u'Built-in wardrobes', u'Ducted vacuum system',u'Gym', u'Indoor spa',
               u'Floorboards', u'Broadband internet available',u'Pay TV access', u'Fireplace',
               u'Ducted', u'heating', u'Ducted cooling',u'Split-system heating',
               u'Hydronic heating',u'Air conditioning', u'Gas heating',u'Lift']
        ext =[u'Carport', u'Garage',u'Open car spaces', u'Remote garage',
              u'Secure parking', u'Swimming pool',u'Tennis court', u'Balcony',
              u'Deck', u'Courtyard',u'Outdoor entertaining area', u'Fully fenced']
        ec = [u'Solar panels', u'Solar hot water',u'Water tank', u'Grey water system',
              u'High Energy efficiency rating', u'Medium Energy efficiency rating',
              u'Low - Energy efficiency rating']
        with transaction.manager:
                for c in inter:
                        indoor = Features(name=c)
                        DBSession.add(indoor)
                        internal.features.append(indoor)
                for e in ext:
                        outdoor = Features(name=e)
                        DBSession.add(outdoor)
                        external.features.append(outdoor)
                for i in ec:
                        ecof = Features(name=i)
                        DBSession.add(ecof)
                        eco.features.append(ecof)
                for o in oth:
                        othr = Features(name=o)
                        DBSession.add(othr)
                        other.features.append(othr)
                DBSession.add_all([external,internal,eco])
                transaction.commit()
Example #21
0
def subscribe_plan(request):
    name = request.matchdict['name']
    type = request.matchdict['type']
    plan = DBSession.query(Plans).filter(Plans.name == name).first()
    title = plan.name + " Plan subscription"

    form = Form(request, schema=PaymentSchema)
    if 'submit' in request.POST and form.validate():
        duration = form.data['duration']
        amount = duration * plan.price_per_month
        discount_percent = "-"
        if 5 < duration < 12:
            # total amount to pay
            total = duration * plan.price_per_month
            # 5% discount since it is more than 5 and less than 12
            discount = total * 0.05
            # resultant amount to pay is now:
            amount = total - discount
            discount_percent = u"5%"
        elif duration == 12:
            # total amount to pay
            total = duration * plan.price_per_month
            # 10% discount since it is 12 months
            discount = total * 0.1
            # resultant amount to pay is now:
            amount = total - discount
            discount_percent = u"10%"
        paystack_secret_key = buddy_settings("paystack_secret_key")
        paystack = Paystack(secret_key=paystack_secret_key)
        #Renew
        if type == "Renew":
            # get active subscription
            # set it to Expired. set the expiration date to today
            # set new subscription expiration date to old active subscription expiration date + one month +2days
            active_sub = request.user.active_subscription[0]
            subscription = Subscription(user=request.user,
                                        plan=plan,
                                        amount=amount,
                                        no_of_months=duration,
                                        discount=discount_percent,
                                        start_date=datetime.today())
            DBSession.add(subscription)
            subscription.end_date = active_sub.end_date + timedelta(
                days=duration * 30 + 2)
            active_sub.status = u"Expired"
        else:
            subscription = Subscription(user=request.user,
                                        plan=plan,
                                        amount=amount,
                                        no_of_months=duration,
                                        discount=discount_percent,
                                        start_date=datetime.today(),
                                        end_date=datetime.today() +
                                        timedelta(days=duration * 30))
            DBSession.add(subscription)

        DBSession.flush()
        callback_url = request.route_url('subscription_success',
                                         reference=subscription.reference)
        try:
            response = paystack.transaction.initialize(
                email=request.user.email,
                callback_url=callback_url,
                amount=str(int(amount)) + "00",
                reference=subscription.reference)
        except requests.exceptions.ConnectionError:
            request.session.flash('info; Not enough Network')
            return HTTPFound(location=request.route_url('pricing'))
        if response['status']:
            authorization_url = response['data']['authorization_url']
            return Response(status_int=302, location=authorization_url)
    return dict(form=FormRenderer(form), title=title, plan=plan, type=type)
Example #22
0
    def add_blog(self):

        title = "Write a blog post"

        user = self.request.user
        if user is None:
            self.request.session.flash('info; Not signed in, Please sign in')
            return HTTPFound(location=self.request.route_url('login'))

        if not self.request.user.email_verified:
            return HTTPFound(
                location=self.request.route_url('confirm_mail_holder'))
        dbsession = DBSession()
        from deform.widget import OptGroup

        def get_categories_inside():
            p = DBSession.query(BlogCategory).all()
            c = []
            for category in p:
                if category.children:
                    g = [category.name]
                    d = [(child.id, child.name) for child in category.children]
                    for i in d:
                        g.append(i)
                    c.append(OptGroup(*tuple(g)))
            return c

        choices = tuple(get_categories_inside())

        class BlogSchema(CSRFSchema):
            title = colander.SchemaNode(colander.String(),
                                        title="Title of blog post",
                                        widget=deform.widget.TextInputWidget(
                                            css_class="form-control required"))
            category_id = colander.SchemaNode(
                colander.Set(),
                title="Categorize your blog post",
                widget=deform.widget.SelectWidget(values=choices,
                                                  multiple=True,
                                                  css_class="required"))
            body = colander.SchemaNode(colander.String(),
                                       title="Body",
                                       widget=deform.widget.TextAreaWidget(
                                           css_class="required",
                                           id="editor",
                                           rows="10"))

            #state_id = colander.SchemaNode(
        #     colander.String(),
        #     title = "State",
        #     missing=u'',
        #     widget = deform.widget.SelectWidget(values=get_states(),

        #          css_class="required")
        # )

        # city = colander.SchemaNode(
        #     colander.String(),
        #     title = "City",
        #     missing=u'',
        #     widget = deform.widget.TextInputWidget(css_class="required")
        #  )

        def validator(form, value):

            if len(value['category_id']) > 8:
                exc = colander.Invalid(form, 'Categories must be less than 8')
                exc['category_id'] = 'Categories must be less than 8'
                raise exc

        button = deform.Button(name="submit",
                               title="Publish",
                               css_class="btn btn-primary pull-right")
        button2 = deform.Button(name="draft",
                                title="Save as Draft",
                                css_class="btn btn-warning pull-left")

        schema = BlogSchema(validator=validator).bind(request=self.request)
        rform = deform.Form(schema,
                            buttons=(button, button2),
                            bootstrap_form_style='form-horizontal')
        form = rform.render()

        if 'submit' in self.request.POST:
            controls = self.request.POST.items()  # get the form controls

            try:
                appstruct = rform.validate(controls)  # call validate
            except deform.ValidationFailure, e:
                return {'form': e.render(), 'title': title}
            blog = Blogs(
                user=self.request.user,
                name=urlify_name(appstruct['title']),
                title=appstruct['title'],
                body=appstruct['body']
                #state_id = appstruct['state_id']
                #city = appstruct['city']
            )
            for category in appstruct['category_id']:
                t = DBSession.query(BlogCategory).get(category)
                blog.categories.append(t)
            blog.status = True
            dbsession.add(blog)
            #non_html_email_sender(
            #    self.request,
            #    recipients=["*****@*****.**"],
            #    subject="Blog post added on site",
            #    body="A user published a blog right now"
            #)
            dbsession.flush()
            return HTTPFound(
                location=self.request.route_url('blog_view', name=blog.name))