Debugging validation
							parent
							
								
									76b3611f13
								
							
						
					
					
						commit
						be0d85180f
					
				| 
						 | 
				
			
			@ -44,6 +44,12 @@ SYMBOL: values
 | 
			
		|||
: with-each-tuple ( seq quot -- )
 | 
			
		||||
    '[ from-tuple @ ] with-each-index ; inline
 | 
			
		||||
 | 
			
		||||
: with-assoc-values ( assoc quot -- )
 | 
			
		||||
    '[ blank-values , from-assoc @ ] with-scope ; inline
 | 
			
		||||
 | 
			
		||||
: with-tuple-values ( assoc quot -- )
 | 
			
		||||
    '[ blank-values , from-tuple @ ] with-scope ; inline
 | 
			
		||||
 | 
			
		||||
: nest-values ( name quot -- )
 | 
			
		||||
    swap [
 | 
			
		||||
        [
 | 
			
		||||
| 
						 | 
				
			
			@ -51,6 +57,13 @@ SYMBOL: values
 | 
			
		|||
        ] with-scope
 | 
			
		||||
    ] dip set-value ; inline
 | 
			
		||||
 | 
			
		||||
: nest-tuple ( name quot -- )
 | 
			
		||||
    swap [
 | 
			
		||||
        [
 | 
			
		||||
            H{ } clone [ <mirror> values set call ] keep
 | 
			
		||||
        ] with-scope
 | 
			
		||||
    ] dip set-value ; inline
 | 
			
		||||
 | 
			
		||||
: object>string ( object -- string )
 | 
			
		||||
    {
 | 
			
		||||
        { [ dup real? ] [ number>string ] }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -217,6 +217,18 @@ STRING: button-tag-markup
 | 
			
		|||
: each-assoc-tag ( tag -- )
 | 
			
		||||
    [ with-each-assoc ] (each-tag) ;
 | 
			
		||||
 | 
			
		||||
: (bind-tag) ( tag quot -- )
 | 
			
		||||
    [
 | 
			
		||||
        [ "name" required-attr value ] keep
 | 
			
		||||
        '[ , process-tag-children ]
 | 
			
		||||
    ] dip call ; inline
 | 
			
		||||
 | 
			
		||||
: bind-tuple-tag ( tag -- )
 | 
			
		||||
    [ with-tuple-values ] (bind-tag) ;
 | 
			
		||||
 | 
			
		||||
: bind-assoc-tag ( tag -- )
 | 
			
		||||
    [ with-assoc-values ] (bind-tag) ;
 | 
			
		||||
 | 
			
		||||
: error-message-tag ( tag -- )
 | 
			
		||||
    children>string render-error ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -280,6 +292,8 @@ STRING: button-tag-markup
 | 
			
		|||
        { "each" [ each-tag ] }
 | 
			
		||||
        { "each-assoc" [ each-assoc-tag ] }
 | 
			
		||||
        { "each-tuple" [ each-tuple-tag ] }
 | 
			
		||||
        { "bind-assoc" [ bind-assoc-tag ] }
 | 
			
		||||
        { "bind-tuple" [ bind-tuple-tag ] }
 | 
			
		||||
        { "comment" [ drop ] }
 | 
			
		||||
        { "call-next-template" [ drop call-next-template ] }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,8 +10,8 @@
 | 
			
		|||
			<tr><th class="field-label">Summary: </th><td><t:field t:name="summary" /></td></tr>
 | 
			
		||||
			<tr><th class="field-label">Author: </th><td><t:field t:name="author" /></td></tr>
 | 
			
		||||
			<tr><th class="field-label">Mode: </th><td><t:choice t:name="mode" t:choices="modes" /></td></tr>
 | 
			
		||||
			<tr><th class="field-label big-field-label">Description: </th><td><t:textarea t:name="contents" /></td></tr>
 | 
			
		||||
			<tr><th class="field-label">Captcha: </th><td><t:captcha t:name="captcha" /></td></tr>
 | 
			
		||||
			<tr><th class="field-label big-field-label">Body: </th><td><t:textarea t:name="contents" t:rows="20" t:cols="60" /></td></tr>
 | 
			
		||||
			<tr><th class="field-label">Captcha: </th><td><t:field t:name="captcha" /></td></tr>
 | 
			
		||||
			<tr>
 | 
			
		||||
			<td></td>
 | 
			
		||||
			<td>Leave the captcha blank. Spam-bots will fill it indiscriminantly, so their attempts to register will be blocked.</td>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -44,8 +44,8 @@
 | 
			
		|||
				<tr><th class="field-label">Summary: </th><td><t:field t:name="summary" /></td></tr>
 | 
			
		||||
				<tr><th class="field-label">Author: </th><td><t:field t:name="author" /></td></tr>
 | 
			
		||||
				<tr><th class="field-label">Mode: </th><td><t:choice t:name="mode" t:choices="modes" /></td></tr>
 | 
			
		||||
				<tr><th class="field-label big-field-label">Description:</th><td><t:textarea t:name="contents" /></td></tr>
 | 
			
		||||
				<tr><th class="field-label">Captcha: </th><td><t:captcha t:name="captcha" /></td></tr>
 | 
			
		||||
				<tr><th class="field-label big-field-label">Body:</th><td><t:textarea t:name="contents" t:rows="20" t:cols="60" /></td></tr>
 | 
			
		||||
				<tr><th class="field-label">Captcha: </th><td><t:field t:name="captcha" /></td></tr>
 | 
			
		||||
				<tr>
 | 
			
		||||
				<td></td>
 | 
			
		||||
				<td>Leave the captcha blank. Spam-bots will fill it indiscriminantly, so their attempts to register will be blocked.</td>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
! Copyright (C) 2007, 2008 Slava Pestov
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: namespaces assocs sorting sequences kernel accessors
 | 
			
		||||
hashtables sequences.lib db.types db.tuples db
 | 
			
		||||
hashtables sequences.lib db.types db.tuples db combinators
 | 
			
		||||
calendar calendar.format math.parser rss xml.writer
 | 
			
		||||
xmode.catalog validators html.components html.templates.chloe
 | 
			
		||||
http.server
 | 
			
		||||
| 
						 | 
				
			
			@ -121,7 +121,9 @@ M: annotation entity-link
 | 
			
		|||
            validate-integer-id
 | 
			
		||||
            "id" value paste from-tuple
 | 
			
		||||
 | 
			
		||||
            "id" value
 | 
			
		||||
            "new-annotation" [
 | 
			
		||||
                "id" set-value
 | 
			
		||||
                mode-names "modes" set-value
 | 
			
		||||
                "factor" "mode" set-value
 | 
			
		||||
            ] nest-values
 | 
			
		||||
| 
						 | 
				
			
			@ -145,6 +147,19 @@ M: annotation entity-link
 | 
			
		|||
        [ validate-integer-id ] >>init
 | 
			
		||||
        [ "id" value paste annotations>> paste-feed ] >>feed ;
 | 
			
		||||
 | 
			
		||||
: validate-paste ( -- )
 | 
			
		||||
    {
 | 
			
		||||
        { "summary" [ v-one-line ] }
 | 
			
		||||
        { "author" [ v-one-line ] }
 | 
			
		||||
        { "mode" [ v-mode ] }
 | 
			
		||||
        { "contents" [ v-required ] }
 | 
			
		||||
        { "captcha" [ v-captcha ] }
 | 
			
		||||
    } validate-params ;
 | 
			
		||||
 | 
			
		||||
: deposit-paste-slots ( tuple -- )
 | 
			
		||||
    now >>date
 | 
			
		||||
    { "summary" "author" "mode" "contents" } deposit-slots ;
 | 
			
		||||
 | 
			
		||||
: <new-paste-action> ( -- action )
 | 
			
		||||
    <page-action>
 | 
			
		||||
        [
 | 
			
		||||
| 
						 | 
				
			
			@ -155,19 +170,13 @@ M: annotation entity-link
 | 
			
		|||
        "new-paste" pastebin-template >>template
 | 
			
		||||
 | 
			
		||||
        [
 | 
			
		||||
            {
 | 
			
		||||
                { "summary" [ v-one-line ] }
 | 
			
		||||
                { "author" [ v-one-line ] }
 | 
			
		||||
                { "mode" [ v-mode ] }
 | 
			
		||||
                { "contents" [ v-required ] }
 | 
			
		||||
                { "captcha" [ v-captcha ] }
 | 
			
		||||
            } validate-params
 | 
			
		||||
            validate-paste
 | 
			
		||||
 | 
			
		||||
            f <paste>
 | 
			
		||||
                now >>date
 | 
			
		||||
                dup { "summary" "author" "mode" "contents" } deposit-slots
 | 
			
		||||
            [ deposit-paste-slots ]
 | 
			
		||||
            [ insert-tuple ]
 | 
			
		||||
            [ id>> "$pastebin/paste" <id-redirect> ] bi
 | 
			
		||||
            [ id>> "$pastebin/paste" <id-redirect> ]
 | 
			
		||||
            tri
 | 
			
		||||
        ] >>submit ;
 | 
			
		||||
 | 
			
		||||
: <delete-paste-action> ( -- action )
 | 
			
		||||
| 
						 | 
				
			
			@ -185,26 +194,22 @@ M: annotation entity-link
 | 
			
		|||
! ! !
 | 
			
		||||
 | 
			
		||||
: <new-annotation-action> ( -- action )
 | 
			
		||||
    <action>
 | 
			
		||||
        [
 | 
			
		||||
            {
 | 
			
		||||
                { "summary" [ v-one-line ] }
 | 
			
		||||
                { "author" [ v-one-line ] }
 | 
			
		||||
                { "mode" [ v-mode ] }
 | 
			
		||||
                { "contents" [ v-required ] }
 | 
			
		||||
                { "captcha" [ v-captcha ] }
 | 
			
		||||
            } validate-params
 | 
			
		||||
        ] >>validate
 | 
			
		||||
    <page-action>
 | 
			
		||||
        [ validate-paste ] >>validate
 | 
			
		||||
 | 
			
		||||
        [ "id" param "$pastebin/paste" <id-redirect> ] >>display
 | 
			
		||||
 | 
			
		||||
        [
 | 
			
		||||
            f f <annotation>
 | 
			
		||||
                now >>date
 | 
			
		||||
                dup { "summary" "author" "mode" "contents" } deposit-slots
 | 
			
		||||
            [ insert-tuple ]
 | 
			
		||||
            [
 | 
			
		||||
                ! Add anchor here
 | 
			
		||||
                "id" value "$pastebin/paste" <id-redirect>
 | 
			
		||||
            ] bi
 | 
			
		||||
            {
 | 
			
		||||
                [ deposit-paste-slots ]
 | 
			
		||||
                [ { "id" } deposit-slots ]
 | 
			
		||||
                [ insert-tuple ]
 | 
			
		||||
                [
 | 
			
		||||
                    ! Add anchor here
 | 
			
		||||
                    id>> "$pastebin/paste" <id-redirect>
 | 
			
		||||
                ]
 | 
			
		||||
            } cleave
 | 
			
		||||
        ] >>submit ;
 | 
			
		||||
 | 
			
		||||
: <delete-annotation-action> ( -- action )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,9 +13,9 @@
 | 
			
		|||
 | 
			
		||||
		<t:each-tuple t:values="pastes">
 | 
			
		||||
			<tr>
 | 
			
		||||
				<td><t:a t:href="$pastebin/view-paste" t:query="id"><t:field t:name="summary" /></t:a></td>
 | 
			
		||||
				<td><t:field t:name="author" /></td>
 | 
			
		||||
				<td><t:field t:name="date" /></td>
 | 
			
		||||
				<td><t:a t:href="$pastebin/paste" t:query="id"><t:label t:name="summary" /></t:a></td>
 | 
			
		||||
				<td><t:label t:name="author" /></td>
 | 
			
		||||
				<td><t:label t:name="date" /></td>
 | 
			
		||||
			</tr>
 | 
			
		||||
		</t:each-tuple>
 | 
			
		||||
	</table>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -132,6 +132,9 @@ posting "POSTINGS"
 | 
			
		|||
: <id-redirect> ( id next -- response )
 | 
			
		||||
    swap "id" associate <standard-redirect> ;
 | 
			
		||||
 | 
			
		||||
: deposit-blog-slots ( blog -- )
 | 
			
		||||
    { "name" "www-url" "feed-url" } deposit-slots ;
 | 
			
		||||
 | 
			
		||||
: <new-blog-action> ( -- action )
 | 
			
		||||
    <page-action>
 | 
			
		||||
        "new-blog" planet-template >>template
 | 
			
		||||
| 
						 | 
				
			
			@ -140,9 +143,10 @@ posting "POSTINGS"
 | 
			
		|||
 | 
			
		||||
        [
 | 
			
		||||
            f <blog>
 | 
			
		||||
                dup { "name" "www-url" "feed-url" } deposit-slots
 | 
			
		||||
            [ deposit-blog-slots ]
 | 
			
		||||
            [ insert-tuple ]
 | 
			
		||||
            [ id>> "$planet-factor/admin/edit-blog" <id-redirect> ] bi
 | 
			
		||||
            [ id>> "$planet-factor/admin/edit-blog" <id-redirect> ]
 | 
			
		||||
            tri
 | 
			
		||||
        ] >>submit ;
 | 
			
		||||
    
 | 
			
		||||
: <edit-blog-action> ( -- action )
 | 
			
		||||
| 
						 | 
				
			
			@ -161,9 +165,10 @@ posting "POSTINGS"
 | 
			
		|||
 | 
			
		||||
        [
 | 
			
		||||
            f <blog>
 | 
			
		||||
                dup { "id" "name" "www-url" "feed-url" } deposit-slots
 | 
			
		||||
            [ deposit-blog-slots ]
 | 
			
		||||
            [ update-tuple ]
 | 
			
		||||
            [ id>> "$planet-factor/admin" <id-redirect> ] bi
 | 
			
		||||
            [ id>> "$planet-factor/admin" <id-redirect> ]
 | 
			
		||||
            tri
 | 
			
		||||
        ] >>submit ;
 | 
			
		||||
 | 
			
		||||
TUPLE: planet-factor-admin < dispatcher ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue