Working mail test

This commit is contained in:
Gregor Kleen 2018-10-04 19:48:07 +02:00
parent 74222dbcc8
commit 1beeea5aa6
8 changed files with 117 additions and 19 deletions

View File

@ -1318,10 +1318,19 @@ unsafeHandler = Unsafe.fakeHandlerGetLogger appLogger
instance YesodMail UniWorX where instance YesodMail UniWorX where
defaultFromAddress = getsYesod $ appMailFrom . appSettings defaultFromAddress = getsYesod $ appMailFrom . appSettings
mailObjectIdDomain = getsYesod $ appMailObjectDomain . appSettings mailObjectIdDomain = getsYesod $ appMailObjectDomain . appSettings
mailVerp = getsYesod $ appMailVerp . appSettings
mailDateTZ = return appTZ mailDateTZ = return appTZ
mailSmtp act = do mailSmtp act = do
pool <- maybe (throwM MailNotAvailable) return =<< getsYesod appSmtpPool pool <- maybe (throwM MailNotAvailable) return =<< getsYesod appSmtpPool
withResource pool act withResource pool act
defaultMailAction ls mail = mailT ls $ do
setMailObjectId
setDateCurrent
ret <- mail
setMailSmtpData
return ret
instance (MonadThrow m, MonadHandler m, HandlerSite m ~ UniWorX) => MonadCrypto m where instance (MonadThrow m, MonadHandler m, HandlerSite m ~ UniWorX) => MonadCrypto m where

View File

@ -12,6 +12,7 @@ module Handler.Admin where
import Import import Import
import Handler.Utils import Handler.Utils
import Jobs
-- import Data.Time -- import Data.Time
-- import qualified Data.Text as T -- import qualified Data.Text as T
@ -20,6 +21,8 @@ import Handler.Utils
import Web.PathPieces (showToPathPiece, readFromPathPiece) import Web.PathPieces (showToPathPiece, readFromPathPiece)
import Database.Persist.Sql (fromSqlKey)
-- import Colonnade hiding (fromMaybe) -- import Colonnade hiding (fromMaybe)
-- import Yesod.Colonnade -- import Yesod.Colonnade
@ -41,28 +44,34 @@ instance Button UniWorX CreateButton where
cssClass CreateInf = BCPrimary cssClass CreateInf = BCPrimary
-- END Button needed here -- END Button needed here
emailTestForm :: AForm (HandlerT UniWorX IO) (Email, [Lang]) emailTestForm :: AForm (HandlerT UniWorX IO) (Email, MailLanguages)
emailTestForm = (,) emailTestForm = (,)
<$> areq emailField (fslI MsgMailTestFormEmail) Nothing <$> areq emailField (fslI MsgMailTestFormEmail) Nothing
<*> areq (reorderField appLanguages) (fslI MsgMailTestFormLanguages) Nothing <*> (MailLanguages <$> areq (reorderField appLanguages) (fslI MsgMailTestFormLanguages) Nothing)
<* submitButton <* submitButton
getAdminTestR :: Handler Html -- Demo Page. Referenzimplementierungen sollte hier gezeigt werden! getAdminTestR, postAdminTestR :: Handler Html -- Demo Page. Referenzimplementierungen sollte hier gezeigt werden!
getAdminTestR = do getAdminTestR = postAdminTestR
(btnWdgt, btnEnctype) <- generateFormPost (buttonForm :: Form CreateButton)
defaultLayout $ do
-- setTitle "Uni2work Admin Testpage"
$(widgetFile "adminTest")
postAdminTestR :: Handler Html
postAdminTestR = do postAdminTestR = do
((btnResult,_), _) <- runFormPost $ buttonForm ((btnResult, btnWdgt), btnEnctype) <- runFormPost $ identifyForm "buttons" (buttonForm :: Form CreateButton)
case btnResult of case btnResult of
(FormSuccess CreateInf) -> addMessage Info "Informatik-Knopf gedrückt" (FormSuccess CreateInf) -> addMessage Info "Informatik-Knopf gedrückt"
(FormSuccess CreateMath) -> addMessage Warning "Knopf Mathematik erkannt" (FormSuccess CreateMath) -> addMessage Warning "Knopf Mathematik erkannt"
FormMissing -> return ()
_other -> addMessage Warning "KEIN Knopf erkannt" _other -> addMessage Warning "KEIN Knopf erkannt"
getAdminTestR
((emailResult, emailWidget), emailEnctype) <- runFormPost . identifyForm "email" $ renderAForm FormStandard emailTestForm
case emailResult of
(FormSuccess (email, ls)) -> runDB $ do
(fromSqlKey -> jId) <- queueJob $ JobSendTestEmail email ls
addMessage Success [shamlet|Email-test gestartet (Job ##{tshow jId})|]
FormMissing -> return ()
(FormFailure errs) -> forM_ errs $ addMessage Error . toHtml
defaultLayout $ do
-- setTitle "Uni2work Admin Testpage"
$(widgetFile "adminTest")
getAdminUserR :: CryptoUUIDUser -> Handler Html getAdminUserR :: CryptoUUIDUser -> Handler Html

View File

@ -103,9 +103,6 @@ jLocked jId act = do
, QueuedJobLockTime =. Nothing , QueuedJobLockTime =. Nothing
] ]
setSerializable = [executeQQ|SET TRANSACTION ISOLATION LEVEL SERIALIZABLE|]
writeJobCtl :: (MonadHandler m, HandlerSite m ~ UniWorX) => JobCtl -> m () writeJobCtl :: (MonadHandler m, HandlerSite m ~ UniWorX) => JobCtl -> m ()
writeJobCtl cmd = do writeJobCtl cmd = do
chan <- getsYesod appJobCtl chan <- getsYesod appJobCtl
@ -113,6 +110,7 @@ writeJobCtl cmd = do
queueJob :: Job -> YesodDB UniWorX QueuedJobId queueJob :: Job -> YesodDB UniWorX QueuedJobId
queueJob job = do queueJob job = do
setSerializable
now <- liftIO getCurrentTime now <- liftIO getCurrentTime
self <- getsYesod appInstanceID self <- getsYesod appInstanceID
jId <- insert QueuedJob jId <- insert QueuedJob
@ -125,13 +123,16 @@ queueJob job = do
writeJobCtl $ JobCtlPerform jId -- FIXME: Should do fancy load balancing across instances (or something) writeJobCtl $ JobCtlPerform jId -- FIXME: Should do fancy load balancing across instances (or something)
return jId return jId
setSerializable :: DB ()
setSerializable = [executeQQ|SET TRANSACTION ISOLATION LEVEL SERIALIZABLE|]
performJob :: Job -> WriterT (Last Bool) (HandlerT UniWorX IO) () performJob :: Job -> WriterT (Last Bool) (HandlerT UniWorX IO) ()
performJob JobSendNotification{ jNotification = NotificationSubmissionRated{..}, .. } = do performJob JobSendNotification{ jNotification = NotificationSubmissionRated{..}, .. } = do
$logDebugS "Jobs" "NotificationSubmissionRated" -- FIXME $logDebugS "Jobs" "NotificationSubmissionRated" -- FIXME
performJob JobSendTestEmail{..} = do performJob JobSendTestEmail{..} = do
$logInfoS "Jobs" $ "Sending test-email to " <> jEmail $logInfoS "Jobs" $ "Sending test-email to " <> jEmail
mailT jLanguages $ do defaultMailAction jLanguages $ do
_mailTo .= [Address Nothing jEmail] _mailTo .= [Address Nothing jEmail]
setSubjectI MsgMailTestSubject setSubjectI MsgMailTestSubject
addPart (($ MsgMailTestContent) :: (UniWorXMessage -> Text) -> Text) -- FIXME addPart (($ MsgMailTestContent) :: (UniWorXMessage -> Text) -> Text) -- FIXME

View File

@ -12,6 +12,7 @@
, TypeFamilies , TypeFamilies
, ViewPatterns , ViewPatterns
, NamedFieldPuns , NamedFieldPuns
, MultiWayIf
#-} #-}
module Mail module Mail
@ -37,6 +38,7 @@ module Mail
, replaceMailHeaderI, addMailHeaderI , replaceMailHeaderI, addMailHeaderI
, setSubjectI, setMailObjectId, setMailObjectId' , setSubjectI, setMailObjectId, setMailObjectId'
, setDateCurrent , setDateCurrent
, setMailSmtpData
, _mailFrom, _mailTo, _mailCc, _mailBcc, _mailHeaders, _mailParts , _mailFrom, _mailTo, _mailCc, _mailBcc, _mailHeaders, _mailParts
, _partType, _partEncoding, _partFilename, _partHeaders, _partContent , _partType, _partEncoding, _partFilename, _partHeaders, _partContent
) where ) where
@ -63,6 +65,8 @@ import qualified Data.Sequence as Seq
import Data.Set (Set) import Data.Set (Set)
import qualified Data.Set as Set import qualified Data.Set as Set
import qualified Data.Text as Text
import qualified Data.Foldable as Foldable import qualified Data.Foldable as Foldable
import qualified Data.Text.Lazy as LT import qualified Data.Text.Lazy as LT
@ -177,10 +181,16 @@ class YesodMail site where
) => (SMTPConnection -> m a) -> m a ) => (SMTPConnection -> m a) -> m a
mailSmtp _ = throwM MailNotAvailable mailSmtp _ = throwM MailNotAvailable
mailVERP :: ( MonadHandler m mailVerp :: ( MonadHandler m
, HandlerSite m ~ site , HandlerSite m ~ site
) => m VerpMode ) => m VerpMode
mailVERP = return VerpNone mailVerp = return VerpNone
defaultMailAction :: ( MonadHandler m
, HandlerSite m ~ site
, MonadBaseControl IO m
) => MailLanguages -> MailT m a -> m a
defaultMailAction = mailT
mailT :: ( MonadHandler m mailT :: ( MonadHandler m
, YesodMail (HandlerSite m) , YesodMail (HandlerSite m)
@ -353,3 +363,25 @@ setDateCurrent = do
tz <- mailDateTZ tz <- mailDateTZ
let timeStr = formatTime defaultTimeLocale "%a, %d %b %Y %T %z" $ ZonedTime (utcToLocalTimeTZ tz now) (timeZoneForUTCTime tz now) let timeStr = formatTime defaultTimeLocale "%a, %d %b %Y %T %z" $ ZonedTime (utcToLocalTimeTZ tz now) (timeZoneForUTCTime tz now)
replaceMailHeader "Date" . Just $ pack timeStr replaceMailHeader "Date" . Just $ pack timeStr
setMailSmtpData :: (MonadHandler m, YesodMail (HandlerSite m)) => MailT m ()
setMailSmtpData = do
Address _ from <- use _mailFrom
recps <- Set.fromList . map addressEmail . concat <$> forM [_mailTo, _mailCc, _mailBcc] use
tell $ mempty { smtpRecipients = recps }
verpMode <- mailVerp
if
| Verp{..} <- verpMode
, [recp] <- Set.toList recps
-> let doVerp (Text.breakOn "@" -> (user, domain)) recp = mconcat
[ user
, Text.singleton verpSeparator
, Text.replace "@" (Text.singleton verpAtReplacement) recp
, domain
]
in tell $ mempty { smtpEnvelopeFrom = Last . Just $ doVerp from recp }
| otherwise
-> tell $ mempty { smtpEnvelopeFrom = Last $ Just from }

View File

@ -9,6 +9,8 @@
, FlexibleContexts , FlexibleContexts
, NamedFieldPuns , NamedFieldPuns
, ScopedTypeVariables , ScopedTypeVariables
, MultiWayIf
, RecordWildCards
#-} #-}
module Utils.Form where module Utils.Form where
@ -23,6 +25,12 @@ import qualified Data.Char as Char
import Data.CaseInsensitive (CI) import Data.CaseInsensitive (CI)
import qualified Data.CaseInsensitive as CI import qualified Data.CaseInsensitive as CI
import Data.Map.Lazy ((!))
import qualified Data.Map.Lazy as Map
import qualified Data.Set as Set
import Data.List ((!!))
import Web.PathPieces import Web.PathPieces
------------------- -------------------
@ -220,6 +228,32 @@ ciField = convertField (CI.mk . fromList . unpack) (pack . toList . CI.original)
reorderField :: ( MonadHandler m reorderField :: ( MonadHandler m
, HandlerSite m ~ site , HandlerSite m ~ site
, Eq a , Eq a
, Show a
) => HandlerT site IO (OptionList a) -> Field m [a] ) => HandlerT site IO (OptionList a) -> Field m [a]
-- ^ Allow the user to enter a /permutation/ of the given options (every option must occur exactly once in the result) -- ^ Allow the user to enter a /permutation/ of the given options (every option must occur exactly once in the result)
reorderField = undefined reorderField optList = Field{..}
where
fieldEnctype = UrlEncoded
fieldParse [] _ = return $ Right Nothing
fieldParse optlist _ = do
OptionList{..} <- liftHandlerT optList
let
olNum = fromIntegral $ length olOptions
selOptions = traceShowId . Map.fromList $ do
i <- [1..olNum]
(readMay -> Just (n :: Word), ('.' : extVal)) <- break (== '.') . unpack <$> optlist
guard $ i == n
Just val <- return . olReadExternal $ pack extVal
return (i, val)
return $ if
| Map.keysSet selOptions == Set.fromList [1..olNum]
-> Right . Just $ map (selOptions !) [1..fromIntegral olNum]
| otherwise
-> Left "Not a valid permutation"
fieldView theId name attrs val isReq = do
OptionList{..} <- liftHandlerT optList
let
isSel n = (==) (either (const $ map optionInternalValue olOptions) id val !! pred n) . optionInternalValue
nums = map (id &&& withNum theId) [1..length olOptions]
withNum t n = tshow n <> "." <> t
$(widgetFile "widgets/permutation")

View File

@ -39,3 +39,6 @@
^{modal ".toggler2" (Just "Test Inhalt für Modal")} ^{modal ".toggler2" (Just "Test Inhalt für Modal")}
<div .btn.toggler2>Klick mich für Content-Test <div .btn.toggler2>Klick mich für Content-Test
<noscript>(Für Modals bitte JS aktivieren)</noscript> <noscript>(Für Modals bitte JS aktivieren)</noscript>
<li>
<form method=post action=@{AdminTestR} enctype=#{emailEnctype}>
^{emailWidget}

View File

@ -0,0 +1,7 @@
$newline never
<ul ##{theId}>
$forall (n, selId) <- nums
<li>
<select ##{selId} name=#{name} :isReq:required *{attrs}>
$forall opt <- olOptions
<option value=#{withNum (optionExternalValue opt) n} :isSel n opt:selected>#{optionDisplay opt}

View File

@ -0,0 +1,3 @@
##{theId} {
list-style-type: none;
}