signature INIT = sig
structure C : SQL_CLIENT
+ val scratchDir : string
val urlPrefix : string
val boardEmail : string
exception Access of string
exception NeedTos
+val scratchDir = "/home/hcoop"
val urlPrefix = "https://members.hcoop.net/portal/"
val emailSuffix = "@new.hcoop.net"
val boardEmail = "board" ^ emailSuffix
<br>
<a href="list?mod=<% #id req %>">[Modify]</a>
<a href="list?del=<% #id req %>">[Delete]</a><br>
- To set up, run: <tt>newlist <% #data req %> <% name %>@hcoop.net <% Util.randomPassword () %></tt>
+ To set up, run: <tt>newlist <% #data req %> <% name %><% Init.emailSuffix %> <% Util.randomPassword () %></tt>
<% end %>
<% end
<tr> <td align="right"><b>Amount</b>:</td> <td><input name="amount" value="<% Util.neg (#amount trn) %>"></td> </tr>
<tr> <td align="right"><b>Free bandwidth cutoff (MB)</b>:</td> <td><input name="cutoff" value="200"></td> </tr>
<tr> <td align="right"><b>Cost/GB</b>:</td> <td><input name="cost" value="4"></td> </tr>
-<tr> <td align="right" valign="top"><b>Member usage</b>:</td> <td><textarea wrap="soft" name="usage" rows="24" cols="80"></textarea></td> </tr>
+<tr> <td align="right" valign="top"><b>Member usage</b>:</td> <td><textarea wrap="soft" name="usage" rows="24" cols="80"><%
+switch Money.lookupHostingUsage id of
+ SOME s => s
+end %></textarea></td> </tr>
<tr> <td><input type="submit" value="Save"></td> </tr>
</table>
val listUsers : int -> (bool * Init.user) list
(* List users and indicate whether they participated in a transaction *)
+ val lookupHostingUsage : int -> string option
+
type charge = {trn : int, usr : int, amount : real}
val addCharge : charge -> unit
val addHostingCharges : hosting -> unit
val equalizeBalances : unit -> unit
-end
\ No newline at end of file
+end
addCharge {trn = trn, usr = #id usr, amount = charge};
umap
end
+
+ val _ = if SM.numItems (foldl doUser umap payers) = 0 then
+ applyCharges trn
+ else
+ raise Fail "Usage description contains an unknown username"
+
+ val usageFile = TextIO.openOut (Init.scratchDir ^ "/usage/" ^ Int.toString trn)
in
- if SM.numItems (foldl doUser umap payers) = 0 then
- applyCharges trn
- else
- raise Fail "Usage description contains an unknown username"
+ TextIO.output (usageFile, usage);
+ TextIO.closeOut usageFile
end
fun equalizeBalances () =
ignore (C.dml (getDb ()) ($`UPDATE Balance SET amount = (SELECT SUM(amount) FROM Charge JOIN WebUser ON usr = WebUser.id WHERE bal = Balance.id)`))
-end
\ No newline at end of file
+fun lookupHostingUsage trn =
+ let
+ val usageFile = TextIO.openIn (Init.scratchDir ^ "/usage/" ^ Int.toString trn)
+
+ fun loop acc =
+ case TextIO.inputLine usageFile of
+ NONE => String.concat (List.rev acc)
+ | SOME line => loop (line :: acc)
+ in
+ SOME (loop [])
+ before TextIO.closeIn usageFile
+ end handle _ => NONE
+
+end
NONE => done ()
| SOME s =>
case String.tokens Char.isSpace s of
- [uname, dash, blocks, bsoft, bhard, files, fsoft, fhard] =>
+ [uname, "--", blocks, bsoft, bhard, files, fsoft, fhard] =>
+ readData ({uname = uname,
+ blocks = valOf (Int.fromString blocks),
+ files = valOf (Int.fromString files)} :: acc)
+ | [uname, "+-", blocks, bsoft, bhard, _, files, fsoft, fhard] =>
+ readData ({uname = uname,
+ blocks = valOf (Int.fromString blocks),
+ files = valOf (Int.fromString files)} :: acc)
+ | [uname, "-+", blocks, bsoft, bhard, files, fsoft, fhard, _] =>
+ readData ({uname = uname,
+ blocks = valOf (Int.fromString blocks),
+ files = valOf (Int.fromString files)} :: acc)
+ | [uname, "++", blocks, bsoft, bhard, _, files, fsoft, fhard, _] =>
readData ({uname = uname,
blocks = valOf (Int.fromString blocks),
files = valOf (Int.fromString files)} :: acc)
()
else
(Mail.mwrite (mail, name);
+ Mail.mwrite (mail, emailSuffix);
Mail.mwrite (mail, ","))
end
in
<table>
<tr> <td align="right"><b>Member</b>:</td> <td><% #name user %></td> </tr>
<tr> <td align="right"><b>Real name</b>:</td> <td><% Web.html (#rname user) %></td> </tr>
-<tr> <td align="right"><b>Hcoop e-mail</b>:</td> <td><a href="mailto:<% #name user %>@hcoop.net"><tt><% #name user %>@hcoop.net</tt></a></td> </tr>
+<tr> <td align="right"><b>Hcoop e-mail</b>:</td> <td><a href="mailto:<% #name user %><% Init.emailSuffix %>"><tt><% #name user %><% Init.emailSuffix %></tt></a></td> </tr>
<tr> <td align="right"><b>Joined</b>:</td> <td><% #joined user %></td> </tr>
<tr> <td align="right"><b>Locations</b>:</td> <td><%
ref first = true;
end;
if $"subscribe" = "on" then
- if not (Pref.subscribe ("hcoop-announce", $"name" ^ "@hcoop.net")) then
+ if not (Pref.subscribe ("hcoop-announce", $"name" ^ Init.emailSuffix)) then
%><h3><b>Error subscribing to hcoop-announce</b></h3><%
end
end %>