opportunity: Creation of a Meetup can now return to its page on error
authorLucas Bajolet <r4pass@hotmail.com>
Mon, 27 Oct 2014 17:21:15 +0000 (13:21 -0400)
committerLucas Bajolet <r4pass@hotmail.com>
Mon, 27 Oct 2014 18:50:40 +0000 (14:50 -0400)
Signed-off-by: Lucas Bajolet <r4pass@hotmail.com>

contrib/opportunity/src/opportunity_controller.nit
contrib/opportunity/src/templates/meetup_creation.nit

index 032b7d3..42df348 100644 (file)
@@ -46,34 +46,66 @@ class OpportunityWelcome
                var get = request.get_args
                var rq = url.split("/")
                if rq.has("meetup_create") then
+                       var ansset = new HashSet[String]
+                       var ans_tmp = "answer_"
+                       var cnt = 1
+                       loop
+                               var anss = request.string_arg(ans_tmp + cnt.to_s)
+                               cnt += 1
+                               if anss == null then break
+                               if ansset.has(anss) then continue
+                               ansset.add anss
+                       end
+
                        var mname = request.string_arg("meetup_name")
                        var mdate = request.string_arg("meetup_date")
                        var mplace = request.string_arg("meetup_place")
-                       if mname == null or mdate == null or mplace == null then return bad_req
+                       if mname == null or mdate == null or mplace == null then
+                               if mname == null then mname = ""
+                               if mdate == null then mdate = ""
+                               if mplace == null then mplace = ""
+                               var rsp = new HttpResponse(200)
+                               var meetpage = new MeetupCreationPage
+                               var meet = new Meetup(mname, mdate, mplace)
+                               meetpage.ans = ansset
+                               meetpage.meet = meet
+                               meetpage.error = "Name, Date and Place are mandatory fields."
+                               rsp.body = meetpage.write_to_string
+                               return rsp
+
+                       end
                        var db = new OpportunityDB.open(db_path)
                        var meet = new Meetup(mname, mdate, mplace)
-                       if meet == null then
+                       if ansset.is_empty then
                                db.close
-                               return bad_req
+                               var rsp = new HttpResponse(200)
+                               var meetpage = new MeetupCreationPage
+                               meetpage.meet = meet
+                               meetpage.error = "You need to input at least one answer."
+                               rsp.body = meetpage.write_to_string
+                               return rsp
                        end
-                       meet.commit(db)
-                       var ans_tmp = "answer_"
-                       var cnt = 1
-                       loop
-                               var anss = request.string_arg(ans_tmp + cnt.to_s)
-                               if anss == null then break
-                               var ans = new Answer(anss)
+                       if not meet.commit(db) then
+                               db.close
+                               var meetid = (mname + mdate + mplace).sha1_to_s
+                               var rsp = new HttpResponse(200)
+                               var meetpage = new MeetupCreationPage
+                               meetpage.meet = meet
+                               meetpage.ans = ansset
+                               meetpage.error = """<p>Could not create Meetup.</p>
+                               <p>Hmm, that's embarassing, there already seems to be a Meetup like yours <a href="/?meetup_id={{{meetid}}}">here</a>.</p>
+                               <p>If this is not yours, please contact the mainainers of the website, you might have found a bug !</p>"""
+                               rsp.body = meetpage.write_to_string
+                               return rsp
+                       end
+                       for v in ansset do
+                               var ans = new Answer(v)
                                ans.meetup = meet
                                ans.commit(db)
-                               cnt += 1
                        end
                        db.close
                        var rsp = new HttpResponse(200)
-                       if meet.id == "" then
-                               rsp.body = (new MeetupCreationPage).write_to_string
-                       else
-                               rsp.body = (new MeetupConfirmation(meet)).write_to_string
-                       end
+                       rsp.body = (new MeetupConfirmation(meet)).write_to_string
                        return rsp
                end
                if rq.has("new_meetup") then
index 8cd364a..498b524 100644 (file)
 module meetup_creation
 
 import boilerplate
+import opportunity_model
 
 class MeetupCreationPage
        super OpportunityPage
 
+       var meet: nullable Meetup = null is writable
+
+       var error: nullable String = null is writable
+
+       var ans: Set[String] = new HashSet[String] is writable
+
        init do
                header.page_js = """
                        function new_answer(sender){
@@ -33,25 +40,57 @@ class MeetupCreationPage
                                ch.last().after('<label for="answer_' + nb + '">' + nb + '</label>');
                        }
                """
-               body = """
+
+       end
+
+       redef fun rendering do
+               # Do stuff with body before rendering
+               var bdy = new Template
+
+               bdy.add "<center>"
+
+               if error != null then
+                       bdy.add "<p></p>"
+                       bdy.add """<div class="alert alert-danger alert-dismissible" role="alert">
+                               <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
+                               """
+                       bdy.add error.as(not null)
+                       bdy.add "</div>"
+               end
+
+               bdy.add """
                <div class="page-header">
                        <center><h1>New meetup</h1></center>
                </div>
-               <center>
-               <form action="meetup_create" method="POST" role="form">
+               """
+               bdy.add """<form action="meetup_create" method="POST" role="form">
                        <div class = "form-group">
                                <label for="meetup_name">Meetup Name : </label>
-                               <input name="meetup_name" id="meetup_name" type="text" class="form-control" placeholder="Meetup Name"/>
+                               <input name="meetup_name" id="meetup_name" type="text" class="form-control" placeholder="Meetup Name" value="{{{if meet != null then meet.name else ""}}}" />
                                <label for="meetup_date">When ? </label>
-                               <input name="meetup_date" id="meetup_date" type="text" class="form-control" placeholder="Time of the event">
+                               <input name="meetup_date" id="meetup_date" type="text" class="form-control" placeholder="Time of the event" value="{{{if meet != null then meet.date else ""}}}">
                                <label for="meetup=place">Where ? </label>
-                               <input name="meetup_place" id="meetup_place" type="text" class="form-control" placeholder="Place of the event">
+                               <input name="meetup_place" id="meetup_place" type="text" class="form-control" placeholder="Place of the event" value="{{{if meet != null then meet.place else ""}}}">
                        </div>
                        <div id="answers" class="form-group">
                                <h2>Answers</h2>
-                               <label for="answer_1">1</label>
-                               <input name="answer_1" id="answer_1" type="text" class="form-control" placeholder="Answer">
-                       </div>
+"""
+
+               if ans.is_empty then
+                       bdy.add """<label for="answer_1">1</label>
+                               <input name="answer_1" id="answer_1" type="text" class="form-control" placeholder="Answer">"""
+               else
+                       var cnt = 1
+                       for v in ans do
+                               bdy.add """
+                               <label for="answer_{{{cnt}}}">{{{cnt}}}</label>
+                               <input name="answer_{{{cnt}}}" id="answer_{{{cnt}}}" type="text" class="form-control" value="{{{v}}}"/>
+                               """
+                               cnt += 1
+                       end
+               end
+
+               bdy.add """</div>
                        <div class="form-group">
                                <button type="button" class="btn btn-lg" onclick="new_answer(this)">Add answer</button>
                        </div>
@@ -61,6 +100,8 @@ class MeetupCreationPage
                </form>
                </center>
 """
+               body = bdy
+               super
        end
 
 end