merge from Yavsc

main
Paul Schneider 10 years ago
commit 53325b7e6c
30 changed files with 243 additions and 546 deletions

@ -1,7 +1,7 @@
VERSION=1.1 VERSION=1.1
CONFIG=Debug CONFIG=Debug
LDYDESTDIR=build/web/$(CONFIG) LDYDESTDIR=dist/web/$(CONFIG)
COPYUNCHANGED="false" COPYUNCHANGED="false"
RSYNCCMD=rsync -ravu --chown=www-data:www-data RSYNCCMD=rsync -ravu --chown=www-data:www-data
HOST_rsync_dev=totemdev.localdomain HOST_rsync_dev=totemdev.localdomain
@ -28,7 +28,7 @@ rsync_% : DESTDIR = $(DESTDIR_$@)
rsync_% : deploy rsync_% : deploy
echo "!Deploying to $(HOST)!" echo "!Deploying to $(HOST)!"
$(RSYNCCMD) build/web/$(CONFIG)/ root@$(HOST):$(DESTDIR) $(RSYNCCMD) dist/web/$(CONFIG)/ root@$(HOST):$(DESTDIR)
ssh root@$(HOST) "service apache2 reload" ssh root@$(HOST) "service apache2 reload"
build: build:

@ -1,14 +0,0 @@
2015-10-09 Paul Schneider <paul@pschneider.fr>
* NpgsqlBlogProvider.cs: - Fixes access on bills
- Fixes usage of bill without photo
2015-10-08 Paul Schneider <paul@pschneider.fr>
* NpgsqlBlogProvider.cs: Fixes last commit in case of DBNull
reading the photo
2015-10-08 Paul Schneider <paul@pschneider.fr>
* NpgsqlBlogProvider.cs: implements a blog post photo storage

@ -434,7 +434,7 @@ namespace Npgsql.Web.Blog
if (circles.Length>0) if (circles.Length>0)
using (NpgsqlCommand cmd = cnx.CreateCommand ()) { using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
cmd.CommandText = "insert into blog_access (post_id,circle_id) values (:pid,:cid)"; cmd.CommandText = "insert into blog_access (post_id,circle_id) values (:pid,:cid)";
cmd.Parameters.AddWithValue ("pid", pid); cmd.Parameters.AddWithValue ("pid", NpgsqlTypes.NpgsqlDbType.Bigint, pid);
cmd.Parameters.Add ("cid", NpgsqlTypes.NpgsqlDbType.Bigint); cmd.Parameters.Add ("cid", NpgsqlTypes.NpgsqlDbType.Bigint);
cmd.Prepare (); cmd.Prepare ();
foreach (long ci in circles) { foreach (long ci in circles) {

@ -0,0 +1,76 @@
//
// BlogUnitTest.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using NUnit.Framework;
using System;
using Yavsc.Model.Blogs;
using Yavsc.Controllers;
using System.Web.Mvc;
using System.Web.Security;
namespace TestAPI
{
[TestFixture ()]
public class BlogUnitTest
{
public string UserName { get; set; }
public string Email { get; set; }
public string Password { get; set; }
AccountController accountController;
[TestFixtureSetUp]
public void Init()
{
accountController = new AccountController ();
}
[Test ()]
public void Register ()
{
ViewResult actionResult = accountController.Register (
new Yavsc.Model.RolesAndMembers.RegisterViewModel () {
UserName = UserName, Email = Email,
Password = "tpwd", ConfirmPassword = Password,
IsApprouved = true
},
"/testreturnurl") as ViewResult;
Assert.AreEqual (actionResult.ViewName, "RegistrationPending");
MembershipUser u = Membership.GetUser (UserName, false);
Assert.NotNull (u);
Assert.False (u.IsApproved);
// TODO : check mail for test,
// get the validation key from its body,
// and use the accountController.Validate(username,key)
u.IsApproved = true;
Membership.UpdateUser (u);
Assert.True (u.IsApproved);
}
[TestFixtureTearDown()]
public void Unregister()
{
ViewResult actionResult =
accountController.Unregister (UserName, true) as ViewResult;
Assert.AreEqual (actionResult.ViewName, "Index");
}
}
}

@ -9,7 +9,7 @@
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<RootNamespace>TestAPI</RootNamespace> <RootNamespace>TestAPI</RootNamespace>
<AssemblyName>TestAPI</AssemblyName> <AssemblyName>TestAPI</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion> <TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
@ -55,10 +55,14 @@
<Reference Include="Spark"> <Reference Include="Spark">
<HintPath>..\packages\Spark.1.8.1.0\lib\NET45\Spark.dll</HintPath> <HintPath>..\packages\Spark.1.8.1.0\lib\NET45\Spark.dll</HintPath>
</Reference> </Reference>
<Reference Include="System.Web.Mvc" />
<Reference Include="System.Web.ApplicationServices" />
<Reference Include="System.Web" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TestAutomate.cs" /> <Compile Include="TestAutomate.cs" />
<Compile Include="BlogUnitTest.cs" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup> <ItemGroup>
@ -66,6 +70,10 @@
<Project>{68F5B80A-616E-4C3C-91A0-828AA40000BD}</Project> <Project>{68F5B80A-616E-4C3C-91A0-828AA40000BD}</Project>
<Name>YavscModel</Name> <Name>YavscModel</Name>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\web\Web.csproj">
<Project>{77044C92-D2F1-45BD-80DD-AA25B311B027}</Project>
<Name>Web</Name>
</ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="packages.config" /> <None Include="packages.config" />

@ -40,7 +40,7 @@ namespace Yavsc.Admin
*/ */
Exec ("pg_dump", string.Format ( Exec ("pg_dump", string.Format (
"-f {0} -Ft -h {1} -U {2} -p {3} {4}", "-f {0} -Ft -h {1} -U {2} -p {3} {4}",
fileName, da.Host, da.Dbuser, da.Port, da.Dbname ),e); fileName, da.Host, da.DbUser, da.Port, da.DbName ),e);
return e; return e;
} }
@ -74,7 +74,7 @@ namespace Yavsc.Admin
var t = new TaskOutput (); var t = new TaskOutput ();
Exec ("pg_restore", (dataOnly?"-a ":"")+string.Format ( Exec ("pg_restore", (dataOnly?"-a ":"")+string.Format (
"-1 -Ft -O -h {0} -U {1} -p {2} -d {3} {4}", "-1 -Ft -O -h {0} -U {1} -p {2} -d {3} {4}",
da.Host, da.Dbuser, da.Port, da.Dbname, fileName ),t); da.Host, da.DbUser, da.Port, da.DbName, fileName ),t);
/* /*
Exec ("pg_restore", (dataOnly?"-a ":"")+string.Format ( Exec ("pg_restore", (dataOnly?"-a ":"")+string.Format (
"-1 -w -Fd -O -h {0} -U {1} -p {2} -d {3} {4}", "-1 -w -Fd -O -h {0} -U {1} -p {2} -d {3} {4}",
@ -149,7 +149,7 @@ namespace Yavsc.Admin
var t = new TaskOutput (); var t = new TaskOutput ();
Exec ("pg_restore", string.Format ( Exec ("pg_restore", string.Format (
"-a -w -Fd -O -h {0} -U {1} -p {2} -d {3} {4}", "-a -w -Fd -O -h {0} -U {1} -p {2} -d {3} {4}",
da.Host, da.Dbuser, da.Port, da.Dbname, fileName ),t); da.Host, da.DbUser, da.Port, da.DbName, fileName ),t);
return t; return t;
} }
} }

@ -1,7 +1,7 @@
using System; using System;
using System.ComponentModel; using System.ComponentModel;
namespace Yavsc.Admin namespace Yavsc.Model.Admin
{ {
/// <summary> /// <summary>
/// Export. /// Export.
@ -9,7 +9,7 @@ namespace Yavsc.Admin
public class Export: TaskOutput public class Export: TaskOutput
{ {
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="Yavsc.Admin.Export"/> class. /// Initializes a new instance of the <see cref="Yavsc.Model.Admin.Export"/> class.
/// </summary> /// </summary>
public Export () public Export ()
{ {

@ -72,7 +72,7 @@ namespace Yavsc.ApiControllers
break; break;
case MembershipCreateStatus.Success: case MembershipCreateStatus.Success:
if (!model.IsApprouved) if (!model.IsApprouved)
YavscHelpers.SendActivationMessage (user); Url.SendActivationMessage (user);
ProfileBase prtu = ProfileBase.Create (model.UserName); ProfileBase prtu = ProfileBase.Create (model.UserName);
prtu.SetPropertyValue("Name",model.Name); prtu.SetPropertyValue("Name",model.Name);
prtu.SetPropertyValue("Address",model.Address); prtu.SetPropertyValue("Address",model.Address);
@ -99,9 +99,12 @@ namespace Yavsc.ApiControllers
public void ResetPassword(LostPasswordModel model) public void ResetPassword(LostPasswordModel model)
{ {
StringDictionary errors; StringDictionary errors;
YavscHelpers.ResetPassword (model, out errors); MembershipUser user;
YavscHelpers.ValidatePasswordReset (model, out errors, out user);
foreach (string key in errors.Keys) foreach (string key in errors.Keys)
ModelState.AddModelError (key, errors [key]); ModelState.AddModelError (key, errors [key]);
if (user != null && ModelState.IsValid)
Url.SendActivationMessage (user);
} }
} }
} }

@ -165,7 +165,7 @@ namespace Yavsc.ApiControllers
try try
{ {
// Read the form data. // Read the form data.
await Request.Content.ReadAsMultipartAsync(provider) ; IEnumerable<HttpContent> data = await Request.Content.ReadAsMultipartAsync(provider) ;
var invalidChars = Path.GetInvalidFileNameChars(); var invalidChars = Path.GetInvalidFileNameChars();
List<string> bodies = new List<string>(); List<string> bodies = new List<string>();
@ -175,8 +175,6 @@ namespace Yavsc.ApiControllers
string filename = provider.BodyPartFileNames[fkey]; string filename = provider.BodyPartFileNames[fkey];
string nicename=fkey; string nicename=fkey;
if (fkey.StartsWith("\"") && fkey.EndsWith("\"") && fkey.Length > 2)
nicename = fkey.Substring(1,fkey.Length-2);
var filtered = new string (nicename.Where( x=> !invalidChars.Contains(x)).ToArray()); var filtered = new string (nicename.Where( x=> !invalidChars.Contains(x)).ToArray());
FileInfo fi = new FileInfo(filtered); FileInfo fi = new FileInfo(filtered);
@ -184,6 +182,10 @@ namespace Yavsc.ApiControllers
FileInfo fp = new FileInfo (Path.Combine(root,filename)); FileInfo fp = new FileInfo (Path.Combine(root,filename));
if (fi.Exists) fi.Delete(); if (fi.Exists) fi.Delete();
fp.MoveTo(fi.FullName); fp.MoveTo(fi.FullName);
// Get the mime type
using (Process p = new Process ()) { using (Process p = new Process ()) {
p.StartInfo.WorkingDirectory = root; p.StartInfo.WorkingDirectory = root;
p.StartInfo = new ProcessStartInfo (); p.StartInfo = new ProcessStartInfo ();
@ -206,14 +208,14 @@ namespace Yavsc.ApiControllers
); );
} }
} }
bodies.Add(fo.OpenText().ReadToEnd()); parts.Add(fo.OpenText().ReadToEnd());
fi.Delete(); fi.Delete();
fo.Delete(); fo.Delete();
} }
return Request.CreateResponse(HttpStatusCode.OK,string.Join("---\n",bodies),new SimpleFormatter("text/plain")); return Request.CreateResponse(HttpStatusCode.OK,string.Join("---\n",parts),new SimpleFormatter("text/plain"));
} }
catch (System.Exception e) catch (System.Exception e)

@ -27,6 +27,7 @@ using Yavsc.Helpers;
using System.Web.Profile; using System.Web.Profile;
using Yavsc.Model.Circles; using Yavsc.Model.Circles;
using Yavsc.Model.Calendar; using Yavsc.Model.Calendar;
using System.Web.Http.Routing;
namespace Yavsc.ApiControllers namespace Yavsc.ApiControllers
@ -160,7 +161,7 @@ namespace Yavsc.ApiControllers
"déjà enregistré"); "déjà enregistré");
break; break;
case MembershipCreateStatus.Success: case MembershipCreateStatus.Success:
YavscHelpers.SendActivationMessage (user); Url.SendActivationMessage (user);
// TODO set registration id // TODO set registration id
throw new NotImplementedException (); throw new NotImplementedException ();
} }

@ -85,7 +85,8 @@ namespace Yavsc.ApiControllers
return ; return ;
case MembershipCreateStatus.Success: case MembershipCreateStatus.Success:
if (!userModel.IsApprouved) if (!userModel.IsApprouved)
YavscHelpers.SendActivationMessage (user);
Url.SendActivationMessage (user);
return; return;
default: default:
throw new InvalidOperationException (string.Format("Unexpected user creation code :{0}",mcs)); throw new InvalidOperationException (string.Format("Unexpected user creation code :{0}",mcs));

@ -273,6 +273,14 @@ input, select {
font-size: smaller; font-size: smaller;
} }
.menuitem {
border-radius:5px;
margin:.5em;
padding:.5em;
display: inline-block;
}
.onhover { .onhover {
display:none; display:none;
position: absolute; position: absolute;
@ -295,12 +303,10 @@ input, select {
.control,.actionlink,nav { display:none;} .control,.actionlink,nav { display:none;}
} }
@media all and (min-width: 640px) {
.bshpanel { display:block; } .bshpanel { display:block; }
.bsh { display: none; } .bsh { display: none; }
.c3 { display:initial; } .c3 { display:initial; }
.c3-alt { display:none; } .c3-alt { display:none; }
}
@media all and (max-width: 640px) { @media all and (max-width: 640px) {
nav { nav {

@ -1,88 +0,0 @@
2015-10-09 Paul Schneider <paul@pschneider.fr>
* totem-banner.png:
* totem-banner.xs.jpg:
* totem-banner.xxs.jpg: totem custo
* style.css: yastyle
* AccountController.cs: - Fixes route usage with n ovalue for
`id`
- better code at getting the avatar url
* BlogsController.cs: Fixes a Post request without user name
in the route
* YavscHelpers.cs: Implements a file list html rendering
* App.master:
* UserPost.aspx:
* Profile.aspx:
* AssemblyInfo.aspx: yahtmlstructure
* Edit.aspx: Displays a list a attached files
* UserPosts.aspx: yahtmlstrucure
* Web.csproj: new images
* instdbws.sql: returns to the flat list of properies (groups
are not working)
2015-10-08 Paul Schneider <paul@pschneider.fr>
* Contact.aspx: a form background color
* Index.aspx: A link to the credits page
* HomeController.cs: A Credits page
* Credits.aspx: A page title and H1 links
* AssemblyInfo.aspx: A relevant title
2015-10-08 Paul Schneider <paul@pschneider.fr>
* style.css: yastyle
2015-10-08 Paul Schneider <paul@pschneider.fr>
* BlogsController.cs: implements a method to update the photo
url
* style.css: yastyle
* AdminController.cs: refactoring the notification:
Introduces a static `Notice` method, server side, to populate
an array
in `ViewData`, used in the paster page.
* BlogsController.cs: Controls the photo update
* YavscHelpers.cs:
* yavsc.circles.js:
* HomeController.cs:
* GoogleController.cs: notification refactoring
* App.master: - notification refactoring
- html structure in the `nav`
* hallo.js: event 'hallomodified' now also occurs at image
modifications
* to-markdown.js: ?Fixes? html images alt text and title to
Markdown
* yavsc.js: implements the photo in database
* Edit.aspx: A nicer bill edition, with a photo
* UserPost.aspx: Displays the photo
* UserPosts.aspx: Fixes the new usage of `ResultPages`
* Web.config: totem custo
* instdbws.sql: adds a `photo` field in the `blog` table

@ -37,20 +37,7 @@ namespace Yavsc.Controllers
[AcceptVerbs (HttpVerbs.Get)] [AcceptVerbs (HttpVerbs.Get)]
public ActionResult Avatar (string id) public ActionResult Avatar (string id)
{ {
if (id == null) string avatarLocation = Url.AvatarUrl (id);
return new EmptyResult ();
ProfileBase pr = ProfileBase.Create (id);
var avpath = pr.GetPropertyValue("Avatar");
if (avpath == null) {
FileInfo fia = new FileInfo (Server.MapPath (defaultAvatar));
return File (fia.OpenRead (), defaultAvatarMimetype);
}
string avatarLocation = avpath as string;
if (avatarLocation.StartsWith ("~/")) {
avatarLocation = Server.MapPath (avatarLocation);
}
WebRequest wr = WebRequest.Create (avatarLocation); WebRequest wr = WebRequest.Create (avatarLocation);
FileContentResult res; FileContentResult res;
using (WebResponse resp = wr.GetResponse ()) { using (WebResponse resp = wr.GetResponse ()) {
@ -130,11 +117,17 @@ namespace Yavsc.Controllers
return View (); return View ();
} }
public ActionResult RegisterForm()
{
return View ("Register");
}
/// <summary> /// <summary>
/// Register the specified model and returnUrl. /// Register the specified model and returnUrl.
/// </summary> /// </summary>
/// <param name="model">Model.</param> /// <param name="model">Model.</param>
/// <param name="returnUrl">Return URL.</param> /// <param name="returnUrl">Return URL.</param>
[HttpPost]
public ActionResult Register (RegisterViewModel model, string returnUrl) public ActionResult Register (RegisterViewModel model, string returnUrl)
{ {
ViewData ["returnUrl"] = returnUrl; ViewData ["returnUrl"] = returnUrl;
@ -143,6 +136,7 @@ namespace Yavsc.Controllers
ModelState [k].Errors.Clear (); ModelState [k].Errors.Clear ();
return View (model); return View (model);
} }
if (ModelState.IsValid) { if (ModelState.IsValid) {
if (model.ConfirmPassword != model.Password) { if (model.ConfirmPassword != model.Password) {
ModelState.AddModelError ("ConfirmPassword", "Veuillez confirmer votre mot de passe"); ModelState.AddModelError ("ConfirmPassword", "Veuillez confirmer votre mot de passe");
@ -168,7 +162,7 @@ namespace Yavsc.Controllers
"déjà enregistré"); "déjà enregistré");
return View (model); return View (model);
case MembershipCreateStatus.Success: case MembershipCreateStatus.Success:
YavscHelpers.SendActivationMessage (user); Url.SendActivationMessage (user);
ViewData ["username"] = user.UserName; ViewData ["username"] = user.UserName;
ViewData ["email"] = user.Email; ViewData ["email"] = user.Email;
return View ("RegistrationPending"); return View ("RegistrationPending");
@ -207,14 +201,20 @@ namespace Yavsc.Controllers
} }
/// <summary> /// <summary>
/// Unregister the specified confirmed. /// Unregister the specified id and confirmed.
/// </summary> /// </summary>
/// <param name="id">Identifier.</param>
/// <param name="confirmed">If set to <c>true</c> confirmed.</param> /// <param name="confirmed">If set to <c>true</c> confirmed.</param>
[Authorize] [Authorize]
public ActionResult Unregister (bool confirmed = false) public ActionResult Unregister (string id, bool confirmed = false)
{ {
ViewData ["UserName"] = id;
if (!confirmed) if (!confirmed)
return View (); return View ();
string logged = Membership.GetUser ().UserName;
if (logged != id)
if (!Roles.IsUserInRole ("Admin"))
throw new Exception ("Unregister another user");
Membership.DeleteUser ( Membership.DeleteUser (
Membership.GetUser ().UserName); Membership.GetUser ().UserName);
@ -391,9 +391,13 @@ namespace Yavsc.Controllers
{ {
if (Request.HttpMethod == "POST") { if (Request.HttpMethod == "POST") {
StringDictionary errors; StringDictionary errors;
YavscHelpers.ResetPassword (model, out errors); MembershipUser user;
YavscHelpers.ValidatePasswordReset (model, out errors, out user);
foreach (string key in errors.Keys) foreach (string key in errors.Keys)
ModelState.AddModelError (key, errors [key]); ModelState.AddModelError (key, errors [key]);
if (user != null && ModelState.IsValid)
Url.SendActivationMessage (user);
} }
return View (model); return View (model);
} }

@ -43,6 +43,10 @@ namespace Yavsc.Controllers
datac.BackupPrefix = Server.MapPath (datac.BackupPrefix); datac.BackupPrefix = Server.MapPath (datac.BackupPrefix);
DataManager mgr = new DataManager (datac); DataManager mgr = new DataManager (datac);
TaskOutput tcdb = mgr.CreateDb (); TaskOutput tcdb = mgr.CreateDb ();
ViewData ["DbName"] = datac.DbName;
ViewData ["DbUser"] = datac.DbUser;
ViewData ["Host"] = datac.Host;
ViewData ["Port"] = datac.Port;
return View ("Created", tcdb); return View ("Created", tcdb);
} }
} }

@ -185,8 +185,8 @@ namespace Yavsc.Controllers
ViewData ["Avatar"] = pr.avatar; ViewData ["Avatar"] = pr.avatar;
ViewData ["BlogTitle"] = pr.BlogTitle; ViewData ["BlogTitle"] = pr.BlogTitle;
MembershipUser u = Membership.GetUser (); MembershipUser u = Membership.GetUser ();
if (u != null)
ViewData ["Author"] = u.UserName; ViewData ["Author"] = bec.Author;
if (!pr.BlogVisible) { if (!pr.BlogVisible) {
// only deliver to admins or owner // only deliver to admins or owner
if (u == null) if (u == null)
@ -197,6 +197,13 @@ namespace Yavsc.Controllers
return View ("NotAuthorized"); return View ("NotAuthorized");
} }
} }
if (u == null || (u.UserName != bec.Author) && !Roles.IsUserInRole (u.UserName, "Admin")) {
// Filer on allowed posts
BlogEntryCollection filtered = bec.FilterFor((u == null)?null : u.UserName);
UUTBlogEntryCollection nbec = new UUTBlogEntryCollection (bec.Author, bec.Title);
nbec.AddRange (filtered);
View ("UserPost",nbec);
}
} }
return View ("UserPost",bec); return View ("UserPost",bec);
} }

@ -5,11 +5,9 @@ using System.Web.Security;
using System.IO; using System.IO;
using System.Web.Configuration; using System.Web.Configuration;
using System.Net.Mail; using System.Net.Mail;
using System.Web.Http.ModelBinding;
using Yavsc.Model.RolesAndMembers; using Yavsc.Model.RolesAndMembers;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Web.Mvc;
using Yavsc.Model.Circles; using Yavsc.Model.Circles;
using System.Web.UI; using System.Web.UI;
using System.Linq.Expressions; using System.Linq.Expressions;
@ -23,31 +21,6 @@ namespace Yavsc.Helpers
/// </summary> /// </summary>
public static class YavscHelpers public static class YavscHelpers
{ {
/// <summary>
/// Formats the circle.
/// </summary>
/// <returns>The circle.</returns>
/// <param name="c">C.</param>
public static HtmlString FormatCircle (Circle c)
{
if (c.Members!=null)
if (c.Members.Length > 0) {
TagBuilder i = new TagBuilder ("i");
i.SetInnerText (String.Join (", ", c.Members));
return new HtmlString (c.Title+"<br/>\n"+i.ToString());
}
return new HtmlString (c.Title);
}
/// <summary>
/// Formats the circle.
/// </summary>
/// <returns>The circle as Html string.</returns>
/// <param name="helper">Helper.</param>
/// <param name="c">C.</param>
public static HtmlString FormatCircle(this HtmlHelper helper, Circle c)
{
return FormatCircle (c);
}
private static string siteName = null; private static string siteName = null;
/// <summary> /// <summary>
@ -77,19 +50,33 @@ namespace Yavsc.Helpers
/// <summary> /// <summary>
/// Sends the activation message. /// Sends the activation message.
/// </summary> /// </summary>
/// <param name="helper">Helper.</param>
/// <param name="user">User.</param> /// <param name="user">User.</param>
public static void SendActivationMessage(MembershipUser user) public static void SendActivationMessage(this System.Web.Http.Routing.UrlHelper helper, MembershipUser user)
{ {
SendEmail (WebConfigurationManager.AppSettings ["RegistrationMessage"], SendActivationMessage (helper.Route("~/Account/Validate/",new { id=user.UserName, key=user.ProviderUserKey.ToString() } )
, WebConfigurationManager.AppSettings ["RegistrationMessage"],
user);
}
/// <summary>
/// Sends the activation message.
/// </summary>
/// <param name="helper">Helper.</param>
/// <param name="user">User.</param>
public static void SendActivationMessage(this System.Web.Mvc.UrlHelper helper, MembershipUser user)
{
SendActivationMessage (helper.Content("~/Account/Validate/"+user.UserName+"/?key="+user.ProviderUserKey.ToString())
, WebConfigurationManager.AppSettings ["RegistrationMessage"],
user); user);
} }
/// <summary> /// <summary>
/// Sends the email. /// Sends the activation message.
/// </summary> /// </summary>
/// <param name="validationUrl">Validation URL.</param>
/// <param name="registrationMessage">Registration message.</param> /// <param name="registrationMessage">Registration message.</param>
/// <param name="user">User.</param> /// <param name="user">User.</param>
public static void SendEmail(string registrationMessage, MembershipUser user) { public static void SendActivationMessage(string validationUrl, string registrationMessage, MembershipUser user) {
FileInfo fi = new FileInfo ( FileInfo fi = new FileInfo (
HttpContext.Current.Server.MapPath (registrationMessage)); HttpContext.Current.Server.MapPath (registrationMessage));
if (!fi.Exists) { if (!fi.Exists) {
@ -104,12 +91,8 @@ namespace Yavsc.Helpers
string body = sr.ReadToEnd (); string body = sr.ReadToEnd ();
body = body.Replace ("<%SiteName%>", YavscHelpers.SiteName); body = body.Replace ("<%SiteName%>", YavscHelpers.SiteName);
body = body.Replace ("<%UserName%>", user.UserName); body = body.Replace ("<%UserName%>", user.UserName);
body = body.Replace ("<%UserActivatonUrl%>", body = body.Replace ("<%UserActivatonUrl%>", validationUrl);
string.Format ("<{0}://{1}/Account/Validate/{2}?key={3}>",
HttpContext.Current.Request.Url.Scheme,
HttpContext.Current.Request.Url.Authority,
user.UserName,
user.ProviderUserKey.ToString ()));
using (MailMessage msg = new MailMessage ( using (MailMessage msg = new MailMessage (
Admail, user.Email, Admail, user.Email,
string.Format ("Validation de votre compte {0}", YavscHelpers.SiteName), string.Format ("Validation de votre compte {0}", YavscHelpers.SiteName),
@ -123,15 +106,16 @@ namespace Yavsc.Helpers
} }
/// <summary> /// <summary>
/// Resets the password. /// Validates the password reset.
/// </summary> /// </summary>
/// <param name="model">Model.</param> /// <param name="model">Model.</param>
/// <param name="errors">Errors.</param> /// <param name="errors">Errors.</param>
public static void ResetPassword(LostPasswordModel model, out StringDictionary errors) /// <param name="user">User.</param>
public static void ValidatePasswordReset(LostPasswordModel model, out StringDictionary errors, out MembershipUser user)
{ {
MembershipUserCollection users = null; MembershipUserCollection users = null;
errors = new StringDictionary (); errors = new StringDictionary ();
user = null;
if (!string.IsNullOrEmpty (model.UserName)) { if (!string.IsNullOrEmpty (model.UserName)) {
users = users =
Membership.FindUsersByName (model.UserName); Membership.FindUsersByName (model.UserName);
@ -159,10 +143,7 @@ namespace Yavsc.Helpers
if (users==null) if (users==null)
return; return;
// Assert users.Count == 1 // Assert users.Count == 1
if (users.Count != 1) foreach (MembershipUser u in users) user = u;
throw new InvalidProgramException ("Emails and user's names are uniques, and we find more than one result here, aborting.");
foreach (MembershipUser u in users)
YavscHelpers.SendActivationMessage (u);
} }
/// <summary> /// <summary>
/// Avatars the URL. /// Avatars the URL.
@ -170,11 +151,19 @@ namespace Yavsc.Helpers
/// <returns>The URL.</returns> /// <returns>The URL.</returns>
/// <param name="helper">Helper.</param> /// <param name="helper">Helper.</param>
/// <param name="username">Username.</param> /// <param name="username">Username.</param>
public static string AvatarUrl (this HtmlHelper helper, string username) { public static string AvatarUrl (this System.Web.Mvc.UrlHelper helper, string username) {
if (username == null)
return null;
ProfileBase pr = ProfileBase.Create (username); ProfileBase pr = ProfileBase.Create (username);
var a = pr.GetPropertyValue("Avatar") ; object avpath = null;
if (a == null || a is DBNull) return "/avatars/" + helper.Encode(username)+".png"; if (pr != null) avpath = pr.GetPropertyValue("Avatar");
return helper.Encode ((string)a); if (avpath == null) return "/bfiles/"+username+".png";
string avatarLocation = avpath as string;
if (avatarLocation.StartsWith ("~/")) {
avatarLocation = helper.RequestContext.HttpContext.Server.MapPath(avatarLocation);
}
return avatarLocation;
} }
/// <summary> /// <summary>
/// Javas the script. /// Javas the script.

@ -26,7 +26,7 @@ var apiBaseUrl = '<%=Url.Content(Yavsc.WebApiConfig.UrlPrefixRelative)%>';
<body> <body>
<header data-type="background" data-speed="8" > <header data-type="background" data-speed="8" >
<asp:ContentPlaceHolder ID="overHeaderOne" runat="server"> <asp:ContentPlaceHolder ID="overHeaderOne" runat="server">
<h1><a href="<%= Html.Encode(Request.Url.AbsoluteUri.ToString()) %>"> <h1><a href="<%= Url.Content("~/") %>">
<%=ViewState["orgtitle"]%></a> <%=ViewState["orgtitle"]%></a>
<span> - <span> -
<a href="<%= Url.Content("~/") %>"><%= YavscHelpers.SiteName %></a> <a href="<%= Url.Content("~/") %>"><%= YavscHelpers.SiteName %></a>
@ -51,8 +51,7 @@ Yavsc.notice('<%=notice%>');
</a> </a>
<% } else { %> <% } else { %>
<a href="/Blog/<%= HttpContext.Current.User.Identity.Name%>" accesskey = "B" class="menuitem" > <a href="/Blog/<%= HttpContext.Current.User.Identity.Name%>" accesskey = "B" class="menuitem" >
<img src="<%=Url.AvatarUrl(HttpContext.Current.User.Identity.Name)%>" alt="vos billets" class="iconsmall" />
<img src="<%=Html.AvatarUrl(HttpContext.Current.User.Identity.Name)%>" alt="vos billets" class="iconsmall" />
<span class="hint">Vos billets</span> <span class="hint">Vos billets</span>
</a> </a>
<a href="<%= Url.Content("~/Account/Profile/" + HttpContext.Current.User.Identity.Name) %>" accesskey="L" class="menuitem"> <a href="<%= Url.Content("~/Account/Profile/" + HttpContext.Current.User.Identity.Name) %>" accesskey="L" class="menuitem">

@ -20,7 +20,7 @@
<input type="submit"/> <input type="submit"/>
<% } %></div> <% } %></div>
<div class="panel"> <div class="panel">
<%= Html.ActionLink("S'enregistrer","Register",new {returnUrl=ViewData["returnUrl"]}, new { @class="actionlink" }) %> <%= Html.ActionLink("S'enregistrer","RegisterForm",new {returnUrl=ViewData["returnUrl"]}, new { @class="actionlink" }) %>
</div> </div>
<div class="panel"> <div class="panel">
<a href="<%=Request.Url.Scheme + "://" + Request.Url.Authority + "/Google/Login"%>?returnUrl=<%=ViewData["returnUrl"]==null?Request.Url.PathAndQuery:(string)ViewData["returnUrl"]%>" class="actionlink"> <a href="<%=Request.Url.Scheme + "://" + Request.Url.Authority + "/Google/Login"%>?returnUrl=<%=ViewData["returnUrl"]==null?Request.Url.PathAndQuery:(string)ViewData["returnUrl"]%>" class="actionlink">

@ -117,7 +117,7 @@ Avatar : <img src="<%=Html.AvatarUrl(HttpContext.Current.User.Identity.Name)%>"
<% } %> <% } %>
<aside> <aside>
<%= Html.ActionLink("Changer de mot de passe","ChangePassword", "Account",null, new { @class="actionlink" })%> <%= Html.ActionLink("Changer de mot de passe","ChangePassword", "Account",null, new { @class="actionlink" })%>
<%= Html.ActionLink("Désincription","Unregister", "Account",null, new { @class="actionlink" })%> <%= Html.ActionLink("Désincription","Unregister", "Account", new { id=ViewData["UserName"] } , new { @class="actionlink" })%>
</aside> </aside>
<aside> <aside>
<% if (Roles.IsUserInRole((string)ViewData ["UserName"],"Admin")) { %> <% if (Roles.IsUserInRole((string)ViewData ["UserName"],"Admin")) { %>

@ -7,5 +7,6 @@ Warning: This will delete all of your data here, your profile, your posts and ot
<label for="confirmed">Unregister</label> <label for="confirmed">Unregister</label>
<%=Html.CheckBox("confirmed")%> <%=Html.CheckBox("confirmed")%>
<input type="submit"/> <input type="submit"/>
<%= Html.Hidden("UserName") %>
<% } %> <% } %>
</asp:Content> </asp:Content>

@ -9,12 +9,12 @@
<%= Html.LabelFor(model => model.Port) %>: <%= Html.LabelFor(model => model.Port) %>:
<%= Html.TextBox( "Port" ) %> <%= Html.TextBox( "Port" ) %>
<%= Html.ValidationMessage("Port", "*") %><br/> <%= Html.ValidationMessage("Port", "*") %><br/>
<%= Html.LabelFor(model => model.Dbname) %>: <%= Html.LabelFor(model => model.DbName) %>:
<%= Html.TextBox( "Dbname" ) %> <%= Html.TextBox( "DbName" ) %>
<%= Html.ValidationMessage("Dbname", "*") %><br/> <%= Html.ValidationMessage("DbName", "*") %><br/>
<%= Html.LabelFor(model => model.Dbuser) %>: <%= Html.LabelFor(model => model.DbUser) %>:
<%= Html.TextBox( "Dbuser" ) %> <%= Html.TextBox( "DbUser" ) %>
<%= Html.ValidationMessage("Dbuser", "*") %><br/> <%= Html.ValidationMessage("DbUser", "*") %><br/>
<%= Html.LabelFor(model => model.Password) %>: <%= Html.LabelFor(model => model.Password) %>:
<%= Html.Password( "Password" ) %> <%= Html.Password( "Password" ) %>
<%= Html.ValidationMessage("Password", "*") %><br/> <%= Html.ValidationMessage("Password", "*") %><br/>

@ -5,8 +5,8 @@
<div><h2>Message </h2> <%= Html.Encode(Model.Message) %></div> <div><h2>Message </h2> <%= Html.Encode(Model.Message) %></div>
<div><h2>Exit Code</h2> <%= Html.Encode(Model.ExitCode) %></div> <div><h2>Exit Code</h2> <%= Html.Encode(Model.ExitCode) %></div>
<form><fieldset><legend>Acces à la base de donnée</legend> <form><fieldset><legend>Acces à la base de donnée</legend>
<label>db Name:</label><%= Html.Encode(Model.Dbname) %><br/> <label>db Name:</label><%= Html.Encode(ViewData["DbName"]) %><br/>
<label>db User:</label><%= Html.Encode(Model.Dbuser) %><br/> <label>db User:</label><%= Html.Encode(ViewData["DbUser"]) %><br/>
<Label>Pass:</label><%= Html.Encode(Model.Password[0]) %> ... You should already know it.<br/> <label>Hôte:</label><%= Html.Encode(ViewData["Host"]) %></fieldset>
<label>Hôte:</label><%= Html.Encode(Model.Host) %>:<%= Model.Port %></filedset> </form>
</asp:Content> </asp:Content>

@ -8,12 +8,12 @@
<%= Html.LabelFor(model => model.Port) %>: <%= Html.LabelFor(model => model.Port) %>:
<%= Html.TextBox( "Port" ) %> <%= Html.TextBox( "Port" ) %>
<%= Html.ValidationMessage("Port", "*") %><br/> <%= Html.ValidationMessage("Port", "*") %><br/>
<%= Html.LabelFor(model => model.Dbname) %>: <%= Html.LabelFor(model => model.DbName) %>:
<%= Html.TextBox( "Dbname" ) %> <%= Html.TextBox( "DbName" ) %>
<%= Html.ValidationMessage("Dbname", "*") %><br/> <%= Html.ValidationMessage("DbName", "*") %><br/>
<%= Html.LabelFor(model => model.Dbuser) %>: <%= Html.LabelFor(model => model.DbUser) %>:
<%= Html.TextBox( "Dbuser" ) %> <%= Html.TextBox( "DbUser" ) %>
<%= Html.ValidationMessage("Dbuser", "*") %><br/> <%= Html.ValidationMessage("DbUser", "*") %><br/>
<%= Html.LabelFor(model => model.Password) %>: <%= Html.LabelFor(model => model.Password) %>:
<%= Html.Password( "Password" ) %> <%= Html.Password( "Password" ) %>
<%= Html.ValidationMessage("Password", "*") %><br/> <%= Html.ValidationMessage("Password", "*") %><br/>

@ -22,12 +22,12 @@
<%= Html.LabelFor(model => model.Port) %>: <%= Html.LabelFor(model => model.Port) %>:
<%= Html.TextBox( "Port" ) %> <%= Html.TextBox( "Port" ) %>
<%= Html.ValidationMessage("Port", "*") %><br/> <%= Html.ValidationMessage("Port", "*") %><br/>
<%= Html.LabelFor(model => model.Dbname) %>: <%= Html.LabelFor(model => model.DbName) %>:
<%= Html.TextBox( "Dbname" ) %> <%= Html.TextBox( "DbName" ) %>
<%= Html.ValidationMessage("Dbname", "*") %><br/> <%= Html.ValidationMessage("DbName", "*") %><br/>
<%= Html.LabelFor(model => model.Dbuser) %>: <%= Html.LabelFor(model => model.DbUser) %>:
<%= Html.TextBox( "Dbuser" ) %> <%= Html.TextBox( "DbUser" ) %>
<%= Html.ValidationMessage("Dbuser", "*") %><br/> <%= Html.ValidationMessage("DbUser", "*") %><br/>
<%= Html.LabelFor(model => model.Password) %>: <%= Html.LabelFor(model => model.Password) %>:
<%= Html.Password( "Password" ) %> <%= Html.Password( "Password" ) %>
<%= Html.ValidationMessage("Password", "*") %><br/> <%= Html.ValidationMessage("Password", "*") %><br/>

@ -47,7 +47,7 @@ namespace Yavsc.Model.Admin
/// Gets or sets the dbname. /// Gets or sets the dbname.
/// </summary> /// </summary>
/// <value>The dbname.</value> /// <value>The dbname.</value>
public string Dbname { public string DbName {
get { get {
return dbname; return dbname;
} }
@ -62,7 +62,7 @@ namespace Yavsc.Model.Admin
/// Gets or sets the dbuser. /// Gets or sets the dbuser.
/// </summary> /// </summary>
/// <value>The dbuser.</value> /// <value>The dbuser.</value>
public string Dbuser { public string DbUser {
get { get {
return dbuser; return dbuser;
} }
@ -101,7 +101,7 @@ namespace Yavsc.Model.Admin
/// </summary> /// </summary>
/// <returns>The string.</returns> /// <returns>The string.</returns>
public string ConnectionString { get { return string.Format ("Server={0};Port={1};Database={2};User Id={3};Password={4};Encoding=Unicode;", public string ConnectionString { get { return string.Format ("Server={0};Port={1};Database={2};User Id={3};Password={4};Encoding=Unicode;",
Host, Port, Dbname, Dbuser, Password); } } Host, Port, DbName, DbUser, Password); } }
} }
} }

@ -3,6 +3,7 @@ using System.Configuration;
using System.Collections.Generic; using System.Collections.Generic;
using Yavsc.Model.Blogs; using Yavsc.Model.Blogs;
using System.Linq; using System.Linq;
using Yavsc.Model.Circles;
namespace Yavsc.Model.Blogs namespace Yavsc.Model.Blogs
{ {
@ -56,7 +57,25 @@ namespace Yavsc.Model.Blogs
{ {
return this.Where (x => x.Title == title).ToArray (); return this.Where (x => x.Title == title).ToArray ();
} }
/// <summary>
/// Filters the current collection for a given user by its name.
/// Assumes that this user is not an author of any of these posts.
/// </summary>
/// <param name="username">Username.</param>
public BlogEntryCollection FilterFor(string username)
{
BlogEntryCollection res = new BlogEntryCollection ();
foreach (BlogEntry be in this) {
if (be.Visible &&
(be.AllowedCircles == null ||
(username!= null && CircleManager.DefaultProvider.Matches
(be.AllowedCircles,username))))
{
res.Add(be);
}
}
return res;
}
/// <summary> /// <summary>
/// Base post info. /// Base post info.
/// </summary> /// </summary>

@ -1,321 +0,0 @@
2015-10-09 Paul Schneider <paul@pschneider.fr>
* LocalizedText.resx:
* LocalizedText.fr.resx:
* LocalizedText.Designer.cs:
* LocalizedText.fr.Designer.cs: a new translation
2015-10-08 Paul Schneider <paul@pschneider.fr>
* BlogEntry.cs: defines the photo in the model
* BlogManager.cs: a new method to set the photo on a blog
post.
* BlogProvider.cs: the blog provider now also gives some photo
* LocalizedText.fr.Designer.cs: Reordering the french
localisation resource
* LocalizedText.fr.resx: Reorders the french localisation
resource
2015-10-04 Paul Schneider <paul@pschneider.fr>
* MarkdownHelper.cs:
* BlogEntryCollection.cs: refactoring + extract an intro from
Markdown for PostInfo*
* YavscModel.csproj: MarkdownHelper integration
2015-10-01 Paul Schneider <paul@pschneider.fr>
* Profile.cs: refactoring
2015-09-30 Paul Schneider <paul@pschneider.fr>
* Profile.cs: Groups profile properties
* ChangeLog: Must not exist in the source tree
2015-09-30 Paul Schneider <paul@pschneider.fr>
* Profile.cs: Grouping profile properties
2015-09-23 Paul Schneider <paul@pschneider.fr>
* BlogEntry.cs:
* BlogManager.cs:
* BlogEntryCollection.cs:
* UUBlogEntryCollection.cs:
* UUTBlogEntryCollection.cs: refactoring
2015-09-16 Paul Schneider <paul@pschneider.fr>
* LocalizedText.resx:
* LocalizedText.fr.resx:
* LocalizedText.Designer.cs:
* LocalizedText.fr.Designer.cs:
2015-09-11 Paul Schneider <paul@pschneider.fr>
* BlogManager.cs: Any user may edit any title
2015-09-10 Paul Schneider <paul@pschneider.fr>
* CircleBase.cs:
2015-09-10 Paul Schneider <paul@pschneider.fr>
* CircleBase.cs: The Circle base
* Circle.cs: Now inherits CircleBase to implement a member
list
* CircleProvider.cs: implements a circle update method
* LocalizedText.resx:
* LocalizedText.Designer.cs: no content!!!
* LocalizedText.fr.resx:
* LocalizedText.fr.Designer.cs: pas content
* YavscModel.csproj: a new CircleBAse class
2015-08-22 Paul Schneider <paul@pschneider.fr>
* LocalizedText.Designer.cs: alphabetic order in ressource
names
* LocalizedText.resx: * alphabetic order in ressource names
* RegisterModel.cs: disposes a duplicated resource string
"UserName" (uses now User_name)
2015-08-20 Paul Schneider <paul@pschneider.fr>
* BlogEntryCollection.cs: cleans used code
2015-08-20 Paul Schneider <paul@pschneider.fr>
* BlogEntryCollection.cs: ConcernsAUniqueTitle and
ConcernsAUniqueUser are now Obsoletes
* UUTBlogEntryCollection.cs: Drops a useless ctor
* CircleProvider.cs: The `CircleManager` now delivers the
user's circle as a `Circle` object collection.
2015-08-14 Paul Schneider <paul@pschneider.fr>
* FileSystemManager.cs: * Fixes the dir separator usage
* Adds a method to validate a directory or file name
* YavscModel.csproj:
* Commande.cs: FileInfoCollection is now removed
* FileInfoCollection.cs:
* DirNotFoundException.cs: Removes useless code
2015-08-05 Paul Schneider <paul@pschneider.fr>
* BlogEntryCollection.cs: adds xml doc
* UUBlogEntryCollection.cs:
* UUTBlogEntryCollection.cs: fixes a creation from a post
array
2015-08-05 Paul Schneider <paul@pschneider.fr>
* BlogManager.cs: fixes the comment posting
2015-08-04 Paul Schneider <paul@pschneider.fr>
* BlogEntryCollection.cs: implement the BlogEntryCollection
* BlogManager.cs: the manager helps to filter on access
* BlogProvider.cs: The title is not unique anymore, and one
can modify it, post a lot under it, drop all posts under it.
A Post is deleted by id.
* UUBlogEntryCollection.cs: implements a collection of post
under a given user name.
* UUTBlogEntryCollection.cs: implements a collection of post
under a given couple (user name, title).
* IDbModule.cs:
* WorkFlowManager.cs: refactoring
* ListItem.cs: ListItem is declared obsolete in this model,
helpers can build MVC SelectListItem on data returned by the
manager.
* LocalizedText.Designer.cs:
* LocalizedText.fr.Designer.cs: autogenerated from xml
* LocalizedText.resx:
* LocalizedText.fr.resx: new labels
* ChangeUserNameProvider.cs: xml doc
* Profile.cs: the UserName property is read only, and comes
from authentication, to change it, we set a Name and validate
it agains the "Profile" method
* UserManager.cs: simpler code a init time
* IContentProvider.cs: implements the new IDataProvider
interface
* IDataProvider.cs: defines the new IDataProvider interface
* YavscModel.csproj: includes new classes
2015-07-17 Paul Schneider <paul@pschneider.fr>
* YavscModel.csproj:
* Automate.cs:
* TaskOutput.cs:
* Service.cs:
* FinalStateException.cs:
* InvalidLetterException.cs:
* PriceOnItemCount.cs:
2015-07-15 Paul Schneider <paul@pschneider.fr>
* ListItem.cs:
* Circle.cs:
* BlogHelper.cs:
* BlogManager.cs:
* BookEdit.cs:
* FreeDate.cs:
* BlogProvider.cs:
* YavscModel.csproj: Moves to Mono framework
2015-07-02 Paul Schneider <paul@pschneider.fr>
* ListItem.cs:
* YavscModel.csproj:
* BlogEntry.cs:
* BlogManager.cs:
* BlogProvider.cs:
* CircleManager.cs:
* CircleProvider.cs:
* SimpleMessage.cs:
2015-06-26 Paul Schneider <paul@pschneider.fr>
* Period.cs:
* WeekDay.cs:
* OpenDay.cs:
* YaEvent.cs:
* Schedule.cs:
* EventPub.cs:
* Position.cs:
* Periodicity.cs:
* ProvidedEvent.cs:
* PositionAndKeyphrase.cs:
* ProviderPublicInfo.cs: refactoring
2015-06-18 Paul Schneider <paul@pschneider.fr>
* RegisterClientModel.cs: Implements the Question and answer
in the registration model
2015-06-18 Paul Schneider <paul@pschneider.fr>
* YavscModel.csproj:
* LocalizedText.resx:
* LocalizedText.fr.resx:
* LocalizedText.Designer.cs:
* Profile.cs:
* Profile.cs:
* LocalizedText.fr.Designer.cs:
* LoginModel.cs:
* Publishing.cs:
* LoginModel.cs:
* Publishing.cs:
* GCMRegister.cs:
* NewRoleModel.cs:
* GCMRegister.cs:
* NewRoleModel.cs:
* NewAdminModel.cs:
* RegisterModel.cs:
* NewAdminModel.cs:
* RegisterModel.cs:
* RegisterViewModel.cs:
* LostPasswordModel.cs:
* ProviderPublicInfo.cs:
* RegisterViewModel.cs:
* ProviderPublicInfo.cs:
* ChangePasswordModel.cs:
* RegisterClientModel.cs:
* RegisterClientModel.cs:
* ChangePasswordModel.cs:
2015-06-12 Paul Schneider <paul@pschneider.fr>
* YavscModel.csproj:
* BlogHelper.cs:
* CircleManager.cs:
* WorkFlowManager.cs:
* NewEstimateEvenArgs.cs:
* Provider.cs:
* DataProviderConfigurationSection.cs:
* ProviderCollection.cs:
* WorkflowConfiguration.cs:
* BlogProviderConfigurationElement.cs:
* BlogProvidersConfigurationSection.cs:
* BlogProvidersConfigurationCollection.cs:
* CatalogProvidersConfigurationSection.cs:
2015-06-10 Paul Schneider <paul@pschneider.fr>
* Circle.cs: refactoring
* CircleInfo.cs:
* CircleProvider.cs:
* Profile.cs: User's profile does not contain anymore the main
e-mail address, it conflicts with registration informations,
it is not part of the profile data
2015-06-10 Paul Schneider <paul@pschneider.fr>
* CircleManager.cs: initializes the default provider
* CircleProvider.cs: Makes abstract the CircleProvider class
2015-06-10 Paul Schneider <paul@pschneider.fr>
* Circle.cs:
* CircleInfo.cs:
* CircleInfoCollection.cs: cleans imports
* CircleManager.cs: implements a circle manager
* CircleProvider.cs: Defines a default Circle provider
* EventPub.cs: refactoring
* YavscModel.csproj: Includes Circle provider definitions
2015-06-09 Paul Schneider <paul@pschneider.fr>
* LocalizedText.resx:
* LocalizedText.Designer.cs:
* LocalizedText.fr.Designer.cs:
* LocalizedText.fr.resx: Page Title
2015-06-09 Paul Schneider <paul@pschneider.fr>
* YavscModel.csproj:
* BlogEditEntryModel.cs:
* BlogEditCommentModel.cs:

@ -1,7 +1,7 @@
using System; using System;
using System.ComponentModel; using System.ComponentModel;
namespace Yavsc.Admin namespace Yavsc.Model.Admin
{ {
/// <summary> /// <summary>

Loading…