Merge branch 'master' into wai-2.0

This commit is contained in:
Michael Snoyman 2013-09-08 13:23:09 +02:00
commit 94f42659ea
13 changed files with 143 additions and 64 deletions

View File

@ -62,9 +62,9 @@ If you aren't building from an application, remove the `./` and create a new dir
## hsenv (Linux only) ## hsenv (Linux and Mac OS X)
[hsenv](http://hackage.haskell.org/package/hsenv) prevents your custom build of Yesod from interfering with your currently installed cabal packages: [hsenv](https://github.com/tmhedberg/hsenv) prevents your custom build of Yesod from interfering with your currently installed cabal packages:
* hsenv creates an isolated environment like cabal-dev * hsenv creates an isolated environment like cabal-dev
* hsenv works at the shell level, so every shell must activate the hsenv * hsenv works at the shell level, so every shell must activate the hsenv

View File

@ -164,6 +164,14 @@ class (YesodAuth site, PathPiece (AuthEmailId site)) => YesodAuthEmail site wher
| TS.length x >= 3 = return $ Right () | TS.length x >= 3 = return $ Right ()
| otherwise = return $ Left "Password must be at least three characters" | otherwise = return $ Left "Password must be at least three characters"
-- | Response after sending a confirmation email.
--
-- Since 1.2.2
confirmationEmailSentResponse :: Text -> HandlerT site IO Html
confirmationEmailSentResponse identifier = defaultLayout $ do
setTitleI Msg.ConfirmationEmailSentTitle
[whamlet|<p>_{Msg.ConfirmationEmailSent identifier}|]
authEmail :: YesodAuthEmail m => AuthPlugin m authEmail :: YesodAuthEmail m => AuthPlugin m
authEmail = authEmail =
AuthPlugin "email" dispatch $ \tm -> AuthPlugin "email" dispatch $ \tm ->
@ -249,9 +257,7 @@ registerHelper allowUsername dest = do
render <- getUrlRender render <- getUrlRender
let verUrl = render $ verify (toPathPiece lid) verKey let verUrl = render $ verify (toPathPiece lid) verKey
lift $ sendVerifyEmail email verKey verUrl lift $ sendVerifyEmail email verKey verUrl
lift $ defaultLayout $ do lift $ confirmationEmailSentResponse identifier
setTitleI Msg.ConfirmationEmailSentTitle
[whamlet|<p>_{Msg.ConfirmationEmailSent identifier}|]
postRegisterR :: YesodAuthEmail master => HandlerT Auth (HandlerT master IO) Html postRegisterR :: YesodAuthEmail master => HandlerT Auth (HandlerT master IO) Html
postRegisterR = registerHelper False registerR postRegisterR = registerHelper False registerR

View File

@ -14,6 +14,7 @@ module Yesod.Auth.Message
, finnishMessage , finnishMessage
, chineseMessage , chineseMessage
, spanishMessage , spanishMessage
, czechMessage
) where ) where
import Data.Monoid (mappend) import Data.Monoid (mappend)
@ -473,4 +474,41 @@ chineseMessage SendPasswordResetEmail = "发送密码重置邮件"
chineseMessage PasswordResetPrompt = "输入你的邮箱地址或用户名,你将收到一封密码重置邮件。" chineseMessage PasswordResetPrompt = "输入你的邮箱地址或用户名,你将收到一封密码重置邮件。"
chineseMessage InvalidUsernamePass = "无效的用户名/密码组合" chineseMessage InvalidUsernamePass = "无效的用户名/密码组合"
czechMessage :: AuthMessage -> Text
czechMessage NoOpenID = "Nebyl nalezen identifikátor OpenID"
czechMessage LoginOpenID = "Přihlásit přes OpenID"
czechMessage LoginGoogle = "Přihlásit přes Google"
czechMessage LoginYahoo = "Přihlásit přes Yahoo"
czechMessage Email = "E-mail"
czechMessage Password = "Heslo"
czechMessage Register = "Registrovat"
czechMessage RegisterLong = "Zaregistrovat nový účet"
czechMessage EnterEmail = "Níže zadejte svou e-mailovou adresu a bude vám poslán potvrzovací e-mail."
czechMessage ConfirmationEmailSentTitle = "Potvrzovací e-mail odeslán"
czechMessage (ConfirmationEmailSent email) =
"Potvrzovací e-mail byl odeslán na " `mappend` email `mappend` "."
czechMessage AddressVerified = "Adresa byla ověřena, prosím nastavte si nové heslo"
czechMessage InvalidKeyTitle = "Neplatný ověřovací klíč"
czechMessage InvalidKey = "Bohužel, ověřovací klíč je neplatný."
czechMessage InvalidEmailPass = "Neplatná kombinace e-mail/heslo"
czechMessage BadSetPass = "Pro nastavení hesla je vyžadováno přihlášení"
czechMessage SetPassTitle = "Nastavit heslo"
czechMessage SetPass = "Nastavit nové heslo"
czechMessage NewPass = "Nové heslo"
czechMessage ConfirmPass = "Potvrdit"
czechMessage PassMismatch = "Hesla si neodpovídají, zkuste to znovu"
czechMessage PassUpdated = "Heslo aktualizováno"
czechMessage Facebook = "Přihlásit přes Facebook"
czechMessage LoginViaEmail = "Přihlásit přes e-mail"
czechMessage InvalidLogin = "Neplatné přihlášení"
czechMessage NowLoggedIn = "Přihlášení proběhlo úspěšně"
czechMessage LoginTitle = "Přihlásit"
czechMessage PleaseProvideUsername = "Prosím, zadejte svoje uživatelské jméno"
czechMessage PleaseProvidePassword = "Prosím, zadejte svoje heslo"
czechMessage NoIdentifierProvided = "Nebyl poskytnut žádný e-mail nebo uživatelské jméno"
czechMessage InvalidEmailAddress = "Zadaná e-mailová adresa je neplatná"
czechMessage PasswordResetTitle = "Obnovení hesla"
czechMessage ProvideIdentifier = "E-mail nebo uživatelské jméno"
czechMessage SendPasswordResetEmail = "Poslat e-mail pro obnovení hesla"
czechMessage PasswordResetPrompt = "Zadejte svou e-mailovou adresu nebo uživatelské jméno a bude vám poslán email pro obnovení hesla."
czechMessage InvalidUsernamePass = "Neplatná kombinace uživatelského jména a hesla"

View File

@ -1,5 +1,5 @@
name: yesod-auth name: yesod-auth
version: 1.2.1 version: 1.2.2
license: MIT license: MIT
license-file: LICENSE license-file: LICENSE
author: Michael Snoyman, Patrick Brisbin author: Michael Snoyman, Patrick Brisbin

View File

@ -1,5 +1,5 @@
name: yesod-bin name: yesod-bin
version: 1.2.2.1 version: 1.2.3
license: MIT license: MIT
license-file: LICENSE license-file: LICENSE
author: Michael Snoyman <michael@snoyman.com> author: Michael Snoyman <michael@snoyman.com>

View File

@ -1,5 +1,5 @@
name: yesod-core name: yesod-core
version: 1.2.4 version: 1.2.4.1
license: MIT license: MIT
license-file: LICENSE license-file: LICENSE
author: Michael Snoyman <michael@snoyman.com> author: Michael Snoyman <michael@snoyman.com>

View File

@ -42,6 +42,7 @@ module Yesod.Form.Fields
, OptionList (..) , OptionList (..)
, mkOptionList , mkOptionList
, optionsPersist , optionsPersist
, optionsPersistKey
, optionsPairs , optionsPairs
, optionsEnum , optionsEnum
) where ) where
@ -86,6 +87,8 @@ import Control.Applicative ((<$>), (<|>))
import Data.Attoparsec.Text (Parser, char, string, digit, skipSpace, endOfInput, parseOnly) import Data.Attoparsec.Text (Parser, char, string, digit, skipSpace, endOfInput, parseOnly)
import Yesod.Persist.Core
defaultFormMessage :: FormMessage -> Text defaultFormMessage :: FormMessage -> Text
defaultFormMessage = englishFormMessage defaultFormMessage = englishFormMessage
@ -513,6 +516,31 @@ optionsPersist filts ords toDisplay = fmap mkOptionList $ do
, optionExternalValue = toPathPiece key , optionExternalValue = toPathPiece key
}) pairs }) pairs
-- | An alternative to 'optionsPersist' which returns just the @Key@ instead of
-- the entire @Entity@.
--
-- Since 1.3.2
optionsPersistKey
:: (YesodPersist site
, PersistEntity a
, PersistQuery (YesodPersistBackend site (HandlerT site IO))
, PathPiece (Key a)
, RenderMessage site msg
, PersistEntityBackend a ~ PersistMonadBackend (YesodDB site))
=> [Filter a]
-> [SelectOpt a]
-> (a -> msg)
-> HandlerT site IO (OptionList (Key a))
optionsPersistKey filts ords toDisplay = fmap mkOptionList $ do
mr <- getMessageRender
pairs <- runDB $ selectList filts ords
return $ map (\(Entity key value) -> Option
{ optionDisplay = mr (toDisplay value)
, optionInternalValue = key
, optionExternalValue = toPathPiece key
}) pairs
selectFieldHelper selectFieldHelper
:: (Eq a, RenderMessage site FormMessage) :: (Eq a, RenderMessage site FormMessage)
=> (Text -> Text -> [(Text, Text)] -> WidgetT site IO () -> WidgetT site IO ()) => (Text -> Text -> [(Text, Text)] -> WidgetT site IO () -> WidgetT site IO ())

View File

@ -99,13 +99,18 @@ askFiles = do
(x, _, _) <- ask (x, _, _) <- ask
return $ liftM snd x return $ liftM snd x
-- | Converts a form field into monadic form. This field requires a value
-- and will return 'FormFailure' if left empty.
mreq :: (RenderMessage site FormMessage, HandlerSite m ~ site, MonadHandler m) mreq :: (RenderMessage site FormMessage, HandlerSite m ~ site, MonadHandler m)
=> Field m a => Field m a -- ^ form field
-> FieldSettings site -> FieldSettings site -- ^ settings for this field
-> Maybe a -> Maybe a -- ^ optional default value
-> MForm m (FormResult a, FieldView site) -> MForm m (FormResult a, FieldView site)
mreq field fs mdef = mhelper field fs mdef (\m l -> FormFailure [renderMessage m l MsgValueRequired]) FormSuccess True mreq field fs mdef = mhelper field fs mdef (\m l -> FormFailure [renderMessage m l MsgValueRequired]) FormSuccess True
-- | Converts a form field into monadic form. This field is optional, i.e.
-- if filled in, it returns 'Just a', if left empty, it returns 'Nothing'.
-- Arguments are the same as for 'mreq' (apart from type of default value).
mopt :: (site ~ HandlerSite m, MonadHandler m) mopt :: (site ~ HandlerSite m, MonadHandler m)
=> Field m a => Field m a
-> FieldSettings site -> FieldSettings site
@ -155,6 +160,7 @@ mhelper Field {..} FieldSettings {..} mdef onMissing onFound isReq = do
, fvRequired = isReq , fvRequired = isReq
}) })
-- | Applicative equivalent of 'mreq'.
areq :: (RenderMessage site FormMessage, HandlerSite m ~ site, MonadHandler m) areq :: (RenderMessage site FormMessage, HandlerSite m ~ site, MonadHandler m)
=> Field m a => Field m a
-> FieldSettings site -> FieldSettings site
@ -162,6 +168,7 @@ areq :: (RenderMessage site FormMessage, HandlerSite m ~ site, MonadHandler m)
-> AForm m a -> AForm m a
areq a b = formToAForm . liftM (second return) . mreq a b areq a b = formToAForm . liftM (second return) . mreq a b
-- | Applicative equivalent of 'mopt'.
aopt :: MonadHandler m aopt :: MonadHandler m
=> Field m a => Field m a
-> FieldSettings (HandlerSite m) -> FieldSettings (HandlerSite m)
@ -218,7 +225,7 @@ postHelper form env = do
_ === _ = False -- in order to avoid timing attacks. _ === _ = False -- in order to avoid timing attacks.
return ((res', xml), enctype) return ((res', xml), enctype)
-- | Similar to 'runFormPost', except it always ignore the currently available -- | Similar to 'runFormPost', except it always ignores the currently available
-- environment. This is necessary in cases like a wizard UI, where a single -- environment. This is necessary in cases like a wizard UI, where a single
-- page will both receive and incoming form and produce a new, blank form. For -- page will both receive and incoming form and produce a new, blank form. For
-- general usage, you can stick with @runFormPost@. -- general usage, you can stick with @runFormPost@.

View File

@ -1,5 +1,5 @@
name: yesod-form name: yesod-form
version: 1.3.1 version: 1.3.2
license: MIT license: MIT
license-file: LICENSE license-file: LICENSE
author: Michael Snoyman <michael@snoyman.com> author: Michael Snoyman <michael@snoyman.com>

View File

@ -1,5 +1,5 @@
name: yesod-platform name: yesod-platform
version: 1.2.3 version: 1.2.4
license: MIT license: MIT
license-file: LICENSE license-file: LICENSE
author: Michael Snoyman <michael@snoyman.com> author: Michael Snoyman <michael@snoyman.com>
@ -15,7 +15,7 @@ homepage: http://www.yesodweb.com/
library library
build-depends: base >= 4 && < 5 build-depends: base >= 4 && < 5
, SHA == 1.6.1 , SHA == 1.6.1
, aeson == 0.6.1.0 , aeson == 0.6.2.0
, ansi-terminal == 0.6 , ansi-terminal == 0.6
, asn1-data == 0.7.1 , asn1-data == 0.7.1
, asn1-types == 0.2.0 , asn1-types == 0.2.0
@ -30,22 +30,24 @@ library
, blaze-markup == 0.5.1.5 , blaze-markup == 0.5.1.5
, byteable == 0.1.1 , byteable == 0.1.1
, byteorder == 1.0.4 , byteorder == 1.0.4
, case-insensitive == 1.0.0.2 , case-insensitive == 1.1
, cereal == 0.3.5.2 , cereal == 0.3.5.2
, certificate == 1.3.8 , certificate == 1.3.8
, cipher-aes == 0.1.8 , cipher-aes == 0.2.5
, cipher-rc4 == 0.1.2 , cipher-rc4 == 0.1.2
, clientsession == 0.9 , clientsession == 0.9.0.3
, conduit == 1.0.7.3 , conduit == 1.0.7.4
, cookie == 0.4.0.1 , cookie == 0.4.0.1
, cprng-aes == 0.3.4 , cprng-aes == 0.5.2
, crypto-api == 0.12.2.1 , crypto-api == 0.12.2.2
, crypto-cipher-types == 0.0.4
, crypto-conduit == 0.5.2 , crypto-conduit == 0.5.2
, crypto-numbers == 0.1.3 , crypto-numbers == 0.2.1
, crypto-pubkey == 0.1.4 , crypto-pubkey == 0.2.1
, crypto-pubkey-types == 0.4.0 , crypto-pubkey-types == 0.4.0
, crypto-random-api == 0.2.0 , crypto-random == 0.0.7
, cryptohash == 0.9.1 , cryptohash == 0.10.0
, cryptohash-cryptoapi == 0.1.0
, css-text == 0.1.1 , css-text == 0.1.1
, data-default == 0.5.3 , data-default == 0.5.3
, data-default-class == 0.0.1 , data-default-class == 0.0.1
@ -56,23 +58,23 @@ library
, date-cache == 0.3.0 , date-cache == 0.3.0
, dlist == 0.5 , dlist == 0.5
, email-validate == 1.0.0 , email-validate == 1.0.0
, entropy == 0.2.2.1 , entropy == 0.2.2.2
, failure == 0.2.0.1 , failure == 0.2.0.1
, fast-logger == 0.3.2 , fast-logger == 0.3.3
, file-embed == 0.0.4.9 , file-embed == 0.0.4.9
, filesystem-conduit == 1.0.0.1 , filesystem-conduit == 1.0.0.1
, hamlet == 1.1.7.1 , hamlet == 1.1.7.1
, hjsmin == 0.1.4.1 , hjsmin == 0.1.4.1
, hspec == 1.6.1 , hspec == 1.7.2
, hspec-expectations == 0.3.2 , hspec-expectations == 0.3.3
, html-conduit == 1.1.0 , html-conduit == 1.1.0
, http-attoparsec == 0.1.0 , http-attoparsec == 0.1.0
, http-conduit == 1.9.4.1 , http-conduit == 1.9.4.5
, http-date == 0.0.4 , http-date == 0.0.4
, http-types == 0.8.0 , http-types == 0.8.1
, language-javascript == 0.5.7 , language-javascript == 0.5.7
, lifted-base == 0.2.1.0 , lifted-base == 0.2.1.0
, mime-mail == 0.4.2 , mime-mail == 0.4.2.1
, mime-types == 0.1.0.3 , mime-types == 0.1.0.3
, mmorph == 1.0.0 , mmorph == 1.0.0
, monad-control == 0.3.2.1 , monad-control == 0.3.2.1
@ -80,7 +82,7 @@ library
, network-conduit == 1.0.0 , network-conduit == 1.0.0
, path-pieces == 0.1.2 , path-pieces == 0.1.2
, pem == 0.1.2 , pem == 0.1.2
, persistent == 1.2.2.0 , persistent == 1.2.3.0
, persistent-template == 1.2.0.2 , persistent-template == 1.2.0.2
, pool-conduit == 0.1.2 , pool-conduit == 0.1.2
, primitive == 0.5.0.1 , primitive == 0.5.0.1
@ -89,54 +91,55 @@ library
, pwstore-fast == 2.3 , pwstore-fast == 2.3
, quickcheck-io == 0.1.0 , quickcheck-io == 0.1.0
, resource-pool == 0.2.1.1 , resource-pool == 0.2.1.1
, resourcet == 0.4.7.1 , resourcet == 0.4.8
, safe == 0.3.3 , safe == 0.3.3
, securemem == 0.1.3
, semigroups == 0.9.2 , semigroups == 0.9.2
, setenv == 0.1.0 , setenv == 0.1.0
, shakespeare == 1.0.5 , shakespeare == 1.0.5.1
, shakespeare-css == 1.0.6.2 , shakespeare-css == 1.0.6.2
, shakespeare-i18n == 1.0.0.3 , shakespeare-i18n == 1.0.0.3
, shakespeare-js == 1.1.4.1 , shakespeare-js == 1.1.4.1
, shakespeare-text == 1.0.0.6 , shakespeare-text == 1.0.0.6
, silently == 1.2.4.1 , silently == 1.2.4.1
, simple-sendfile == 0.2.12 , simple-sendfile == 0.2.12
, skein == 1.0.3 , skein == 1.0.6
, socks == 0.5.1 , socks == 0.5.1
, stringsearch == 0.3.6.4 , stringsearch == 0.3.6.4
, system-fileio == 0.3.11 , system-fileio == 0.3.11
, system-filepath == 0.4.7 , system-filepath == 0.4.7
, tagged == 0.6.1 , tagged == 0.7
, tagsoup == 0.12.8 , tagsoup == 0.13
, tagstream-conduit == 0.5.4 , tagstream-conduit == 0.5.4
, tls == 1.1.2 , tls == 1.1.5
, tls-extra == 0.6.4 , tls-extra == 0.6.5
, transformers-base == 0.4.1 , transformers-base == 0.4.1
, unix-compat == 0.4.1.1 , unix-compat == 0.4.1.1
, unordered-containers == 0.2.3.1 , unordered-containers == 0.2.3.2
, utf8-light == 0.4.0.1 , utf8-light == 0.4.0.1
, utf8-string == 0.3.7 , utf8-string == 0.3.7
, vault == 0.2.0.4 , vault == 0.3.0.0
, vector == 0.10.0.1 , vector == 0.10.0.1
, void == 0.6.1 , void == 0.6.1
, wai == 1.4.0.1 , wai == 1.4.0.2
, wai-app-static == 1.3.1.3 , wai-app-static == 1.3.1.4
, wai-extra == 1.3.4.2 , wai-extra == 1.3.4.4
, wai-logger == 0.3.1 , wai-logger == 0.3.1
, wai-test == 1.3.1.1 , wai-test == 1.3.1.1
, warp == 1.3.9 , warp == 1.3.9.2
, word8 == 0.0.3 , word8 == 0.0.3
, xml-conduit == 1.1.0.5 , xml-conduit == 1.1.0.7
, xml-types == 0.3.4 , xml-types == 0.3.4
, xss-sanitize == 0.3.4 , xss-sanitize == 0.3.4
, yaml == 0.8.4 , yaml == 0.8.4.1
, yesod == 1.2.1.1 , yesod == 1.2.2
, yesod-auth == 1.2.0.2 , yesod-auth == 1.2.2
, yesod-core == 1.2.3 , yesod-core == 1.2.4.1
, yesod-form == 1.3.0.1 , yesod-form == 1.3.2
, yesod-persistent == 1.2.1 , yesod-persistent == 1.2.1
, yesod-routes == 1.2.0.1 , yesod-routes == 1.2.0.1
, yesod-static == 1.2.0 , yesod-static == 1.2.0.1
, yesod-test == 1.2.0 , yesod-test == 1.2.1
, zlib-bindings == 0.1.1.3 , zlib-bindings == 0.1.1.3
, zlib-conduit == 1.0.0 , zlib-conduit == 1.0.0

View File

@ -73,7 +73,7 @@ import Language.Haskell.TH
import Language.Haskell.TH.Syntax as TH import Language.Haskell.TH.Syntax as TH
import Crypto.Conduit (hashFile, sinkHash) import Crypto.Conduit (hashFile, sinkHash)
import Crypto.Hash.MD5 (MD5) import Crypto.Hash.CryptoAPI (MD5)
import Control.Monad.Trans.State import Control.Monad.Trans.State
import qualified Data.ByteString.Base64 import qualified Data.ByteString.Base64

View File

@ -1,5 +1,5 @@
name: yesod-static name: yesod-static
version: 1.2.0 version: 1.2.0.1
license: MIT license: MIT
license-file: LICENSE license-file: LICENSE
author: Michael Snoyman <michael@snoyman.com> author: Michael Snoyman <michael@snoyman.com>
@ -38,7 +38,7 @@ library
, unix-compat >= 0.2 , unix-compat >= 0.2
, conduit >= 0.5 , conduit >= 0.5
, crypto-conduit >= 0.4 , crypto-conduit >= 0.4
, cryptohash >= 0.6.1 , cryptohash-cryptoapi >= 0.1.0
, system-filepath >= 0.4.6 && < 0.5 , system-filepath >= 0.4.6 && < 0.5
, system-fileio >= 0.3 , system-fileio >= 0.3
, data-default , data-default
@ -71,7 +71,7 @@ test-suite tests
, unix-compat , unix-compat
, conduit , conduit
, crypto-conduit , crypto-conduit
, cryptohash , cryptohash-cryptoapi
, system-filepath , system-filepath
, system-fileio , system-fileio
, data-default , data-default

View File

@ -1,11 +1,8 @@
# Overview # Overview
The yesod package The yesod package groups together the various Yesod related packages into one cohesive whole.
* groups together the various Yesod related packages into one cohesive whole. For the yesod executeable, see [yesod-bin](/yesod-bin)
* contains the executable yesod
* yesod devel - start a development environment
* yesod init - create a scaffolded site
# Scaffolding # Scaffolding