a working internationalization ...
This commit is contained in:
16
web/App_GlobalResources/LocalizedText.Designer.cs
generated
16
web/App_GlobalResources/LocalizedText.Designer.cs
generated
@ -15,7 +15,7 @@ namespace Yavsc.App_GlobalResources {
|
||||
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class LocalizedText {
|
||||
public class LocalizedText {
|
||||
|
||||
private static System.Resources.ResourceManager resourceMan;
|
||||
|
||||
@ -26,7 +26,7 @@ namespace Yavsc.App_GlobalResources {
|
||||
}
|
||||
|
||||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static System.Resources.ResourceManager ResourceManager {
|
||||
public static System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.Equals(null, resourceMan)) {
|
||||
System.Resources.ResourceManager temp = new System.Resources.ResourceManager("Yavsc.App_GlobalResources.LocalizedText", typeof(LocalizedText).Assembly);
|
||||
@ -37,7 +37,7 @@ namespace Yavsc.App_GlobalResources {
|
||||
}
|
||||
|
||||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static System.Globalization.CultureInfo Culture {
|
||||
public static System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
@ -46,9 +46,15 @@ namespace Yavsc.App_GlobalResources {
|
||||
}
|
||||
}
|
||||
|
||||
internal static string Previe {
|
||||
public static string Preview {
|
||||
get {
|
||||
return ResourceManager.GetString("Previe", resourceCulture);
|
||||
return ResourceManager.GetString("Preview", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
public static string Welcome {
|
||||
get {
|
||||
return ResourceManager.GetString("Welcome", resourceCulture);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -12,5 +12,6 @@
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Preview"><value>Preview</value><comment>comment on preview</comment></data>
|
||||
<data name="Preview"><value>Prévisualiser</value><comment>Prévisualiser le document</comment></data>
|
||||
<data name="Welcome"><value>Bienvenue</value><comment></comment></data>
|
||||
</root>
|
@ -12,7 +12,6 @@
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
|
||||
<data name="Preview"><value>Preview</value><comment>comment on preview</comment></data>
|
||||
<data name="Welcome"><value>Welcome</value><comment></comment></data>
|
||||
</root>
|
||||
|
13
web/App_GlobalResources/Resources.Designer.cs
generated
13
web/App_GlobalResources/Resources.Designer.cs
generated
@ -45,5 +45,18 @@ namespace Yavsc.App_GlobalResources {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
||||
internal static System.Drawing.Color Color1 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("Color1", resourceCulture);
|
||||
return ((System.Drawing.Color)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
internal static string Name1 {
|
||||
get {
|
||||
return ResourceManager.GetString("Name1", resourceCulture);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ using System.Runtime.CompilerServices;
|
||||
|
||||
// Information about this assembly is defined by the following attributes.
|
||||
// Change them to the values specific to your project.
|
||||
using System.Resources;
|
||||
|
||||
[assembly: AssemblyTitle("Yavsc")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
@ -13,6 +14,8 @@ using System.Runtime.CompilerServices;
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
|
||||
|
||||
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
|
||||
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
|
||||
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
|
||||
|
@ -143,6 +143,7 @@ namespace Yavsc.Controllers
|
||||
return UserPost (BlogManager.GetPost (postid));
|
||||
}
|
||||
}
|
||||
string prevstr = App_GlobalResources.LocalizedText.Preview;
|
||||
return UserPost (BlogManager.GetPost (user, title));
|
||||
}
|
||||
|
||||
|
@ -8,6 +8,9 @@ using System.Web.Configuration;
|
||||
using System.Web.Mvc;
|
||||
using System.Web.Mvc.Ajax;
|
||||
using Yavsc;
|
||||
using System.Reflection;
|
||||
using Yavsc.App_GlobalResources;
|
||||
using System.Resources;
|
||||
|
||||
namespace Yavsc.Controllers
|
||||
{
|
||||
@ -41,6 +44,12 @@ namespace Yavsc.Controllers
|
||||
}
|
||||
}
|
||||
|
||||
public ActionResult ReferencedAssemblies()
|
||||
{
|
||||
AssemblyName[] model = GetType ().Assembly.GetReferencedAssemblies ();
|
||||
|
||||
return View (model);
|
||||
}
|
||||
|
||||
private static string owneremail = null;
|
||||
/// <summary>
|
||||
@ -60,33 +69,12 @@ namespace Yavsc.Controllers
|
||||
|
||||
public ActionResult Index ()
|
||||
{
|
||||
InitCulture ();
|
||||
ViewData ["Message"] = string.Format(T.GetString("Welcome")+"({0})",GetType ().Assembly.FullName);
|
||||
string cn = CultureInfo.CurrentCulture.Name;
|
||||
ViewData ["Message"] =
|
||||
LocalizedText.ResourceManager.GetString("Welcome");
|
||||
return View ();
|
||||
}
|
||||
|
||||
public void InitCulture() {
|
||||
CultureInfo culture = null;
|
||||
string defaultCulture = "fr";
|
||||
if (Request.UserLanguages==null)
|
||||
culture = CultureInfo.CreateSpecificCulture(defaultCulture);
|
||||
else
|
||||
if (Request.UserLanguages.Length > 0) {
|
||||
try {
|
||||
culture = new CultureInfo (Request.UserLanguages [0]);
|
||||
}
|
||||
catch (Exception e) {
|
||||
ViewData ["Message"] = e.ToString ();
|
||||
culture = CultureInfo.CreateSpecificCulture(defaultCulture);
|
||||
}
|
||||
}
|
||||
else culture = CultureInfo.CreateSpecificCulture(defaultCulture);
|
||||
System.Threading.Thread.CurrentThread.CurrentUICulture = culture;
|
||||
System.Threading.Thread.CurrentThread.CurrentCulture = culture;
|
||||
string lcd = Server.MapPath ("./locale");
|
||||
Mono.Unix.Catalog.Init("i8n1", lcd );
|
||||
}
|
||||
|
||||
public ActionResult AOEMail (string reason, string body)
|
||||
{
|
||||
// requires valid owner and admin email?
|
||||
|
@ -12,38 +12,13 @@
|
||||
<link rel="stylesheet" href="/Theme/style.css"/>
|
||||
<link rel="icon" type="image/png" href="/favicon.png" />
|
||||
<link href='http://fonts.googleapis.com/css?family=Dancing+Script:400,700' rel='stylesheet' type='text/css'/>
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<div id="login">
|
||||
|
||||
|
||||
<% if (Membership.GetUser()==null) { %>
|
||||
<%= Html.ActionLink( YavscHelpers.SiteName, "Index", "Home" ) %>
|
||||
<%= Html.ActionLink("Login", "Login", "Account", new { returnUrl=Request.Url.PathAndQuery }, null ) %>
|
||||
|
||||
<% } else { %>
|
||||
<%= HttpContext.Current.User.Identity.Name %> @ <%= Html.ActionLink( YavscHelpers.SiteName, "Index", "Home" ) %>
|
||||
|
||||
<%= Html.ActionLink( "Poster", "Post", "Blogs" ) %>
|
||||
<%= Html.ActionLink( "Profile", "Profile", "Account" ) %>
|
||||
<%= Html.ActionLink( "Logout", "Logout", "Account", new { returnUrl=Request.Url.PathAndQuery }, null) %>
|
||||
|
||||
<% } %>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Use taking care of keeping the title to be the same in the head and h1 sections -->
|
||||
<asp:ContentPlaceHolder ID="overHeaderOne" runat="server">
|
||||
<h1><a href="<%= Html.Encode(Request.Url.AbsoluteUri.ToString()) %>">
|
||||
<%= Page.Title %>
|
||||
</a></h1>
|
||||
<h1><a href="<%= Html.Encode(Request.Url.AbsoluteUri.ToString()) %>"><%= Page.Title %></a></h1>
|
||||
</asp:ContentPlaceHolder>
|
||||
|
||||
<asp:ContentPlaceHolder ID="header" runat="server"></asp:ContentPlaceHolder>
|
||||
<% if (ViewData["Error"]!=null) { %>
|
||||
<div class="error">
|
||||
<%= Html.Encode(ViewData["Error"]) %>
|
||||
@ -54,20 +29,26 @@
|
||||
<%= Html.Encode(ViewData["Message"]) %>
|
||||
</div>
|
||||
<% } %>
|
||||
<!-- a place to add some meta information, under the title -->
|
||||
<asp:ContentPlaceHolder ID="header" runat="server">
|
||||
</asp:ContentPlaceHolder>
|
||||
</header>
|
||||
<main>
|
||||
<asp:ContentPlaceHolder ID="MainContent" runat="server">
|
||||
|
||||
</asp:ContentPlaceHolder>
|
||||
</main>
|
||||
<aside>
|
||||
<div id="login">
|
||||
<% if (Membership.GetUser()==null) { %>
|
||||
<%= Html.ActionLink( YavscHelpers.SiteName, "Index", "Home" ) %>
|
||||
<%= Html.ActionLink("Login", "Login", "Account", new { returnUrl=Request.Url.PathAndQuery }, null ) %>
|
||||
<% } else { %>
|
||||
<%= HttpContext.Current.User.Identity.Name %> @ <%= Html.ActionLink( YavscHelpers.SiteName, "Index", "Home" ) %>
|
||||
<%= Html.ActionLink( "Poster", "Post", "Blogs" ) %>
|
||||
<%= Html.ActionLink( "Profile", "Profile", "Account" ) %>
|
||||
<%= Html.ActionLink( "Logout", "Logout", "Account", new { returnUrl=Request.Url.PathAndQuery }, null) %>
|
||||
<% } %>
|
||||
</div>
|
||||
<asp:ContentPlaceHolder ID="MASContent" runat="server">
|
||||
</asp:ContentPlaceHolder>
|
||||
</asp:ContentPlaceHolder>
|
||||
</aside>
|
||||
|
||||
<footer>
|
||||
<hr/>
|
||||
<%= string.Join("\n",Yavsc.ThanksHelper.Links()) %>
|
||||
|
@ -4,11 +4,10 @@ body {
|
||||
background-image: url('/images/Banner.png');
|
||||
background-repeat: no-repeat;
|
||||
color: #D0FFD0;
|
||||
margin:1em;
|
||||
padding:1em;
|
||||
font-family: 'Arial', cursive;
|
||||
}
|
||||
aside { float: right; }
|
||||
|
||||
aside { float: right; }
|
||||
|
||||
video,img {
|
||||
max-width:100%;
|
||||
@ -17,9 +16,6 @@ video,img {
|
||||
}
|
||||
|
||||
#login {
|
||||
position: fixed;
|
||||
top: 3px;
|
||||
right:3px;
|
||||
font-size:x-small;
|
||||
background-color:rgba(0,0,0,0.6);
|
||||
color:rgb(130,254,130);
|
||||
@ -152,9 +148,8 @@ padding-left: 20px;
|
||||
header,footer,.postcomment,.actionlink,.metablog{ display:none;}
|
||||
}
|
||||
|
||||
@media all and (max-width: 15em) {
|
||||
section, aside {
|
||||
@media all and (max-width: 440px) {
|
||||
aside {
|
||||
float: none;
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,8 @@
|
||||
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<BlogEditEntryModel>" MasterPageFile="~/Models/App.master"%>
|
||||
|
||||
<asp:Content ContentPlaceHolderID="head" ID="head1" runat="server" >
|
||||
<script type="text/javascript" src="/js/jquery-latest.js"></script>
|
||||
<script type="text/javascript" src="/js/rangyinputs-jquery-1.1.2.js"></script>
|
||||
</asp:Content>
|
||||
<asp:Content ContentPlaceHolderID="overHeaderOne" ID="headerContent" runat="server">
|
||||
<h1 class="blogtitle">
|
||||
<a href="/Blog/<%=ViewData["UserName"]%>">
|
||||
@ -7,10 +10,7 @@
|
||||
<%= Html.Encode(ViewData["BlogTitle"]) %> </a> -
|
||||
Nouveau billet -
|
||||
<a href="/"><%= Html.Encode(YavscHelpers.SiteName) %></a> </h1>
|
||||
|
||||
<div class="message">
|
||||
<%= Html.Encode(ViewData["Message"]) %>
|
||||
</div>
|
||||
|
||||
</asp:Content>
|
||||
|
||||
<asp:Content ContentPlaceHolderID="MainContent" ID="MainContentContent" runat="server">
|
||||
@ -36,8 +36,7 @@ Nouveau billet -
|
||||
<div>
|
||||
Usage BBcodes :
|
||||
<ul>
|
||||
<%
|
||||
foreach (string usage in BBCodeHelper.BBTagsUsage) { %>
|
||||
<% foreach (string usage in BBCodeHelper.BBTagsUsage) { %>
|
||||
<li><%= usage %></li>
|
||||
<% } %>
|
||||
</ul>
|
||||
@ -55,7 +54,16 @@ Nouveau billet -
|
||||
<%= Html.ValidationMessage("Preview", "*") %>
|
||||
<br/>
|
||||
<%= Html.Hidden("Id") %>
|
||||
<input type="button" id="btnpreview" value="<%=LocalizedText.Preview %>"/>
|
||||
<input type="submit"/>
|
||||
<input type="button" id="testbtn">
|
||||
<script language="Javascript">
|
||||
$(document).ready(function () {
|
||||
$("#testbtn").click(function () {
|
||||
$("#Content").replaceSelectedText("SOME NEW TEXT");
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<% } %>
|
||||
|
||||
</div>
|
||||
|
@ -1,11 +1,9 @@
|
||||
<%@ Page Title="Yavsc - indexe" Language="C#" Inherits="System.Web.Mvc.ViewPage" MasterPageFile="~/Models/App.master"%>
|
||||
<%@ Page Title="Yavsc - indexe" Language="C#" Inherits="System.Web.Mvc.ViewPage<IEnumerable<System.Reflection.AssemblyName>>" MasterPageFile="~/Models/App.master"%>
|
||||
<asp:Content ContentPlaceHolderID="MainContent" ID="MainContentContent" runat="server">
|
||||
|
||||
<p>
|
||||
« Voir le monde comme un rêve est un bon point de vue. Quand on fait un cauchemar, on se réveille et on se dit que ce n’était qu’un rêve. Il est dit que le monde où nous vivons n’en diffère en rien ».
|
||||
<br/><a href="http://unefenetresurlemonde.over-blog.com/article-34325590.html">Ghost Dog, la Voie du samouraï</a>
|
||||
</p><div>
|
||||
<%= Html.ActionLink("Les blogs","Index","Blogs") %>
|
||||
</div>
|
||||
<ul>
|
||||
<% foreach (System.Reflection.AssemblyName item in Model) { %>
|
||||
<li><%= item.FullName %></li>
|
||||
<% } %>
|
||||
</ul>
|
||||
</asp:Content>
|
||||
|
||||
|
@ -29,6 +29,7 @@
|
||||
<add namespace="Yavsc.Model.Admin" />
|
||||
<add namespace="Yavsc.Model.Blogs" />
|
||||
<add namespace="Yavsc.Model.WorkFlow" />
|
||||
<add namespace="Yavsc.App_GlobalResources" />
|
||||
</namespaces>
|
||||
</pages>
|
||||
</system.web>
|
||||
|
@ -108,7 +108,7 @@ http://msdn2.microsoft.com/en-us/library/b5ysx397.aspx
|
||||
</httpModules>
|
||||
<httpRuntime maxRequestLength="52428800" />
|
||||
<trace enabled="false" localOnly="true" pageOutput="false" requestLimit="10" traceMode="SortByTime" />
|
||||
<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="auto" uiCulture="auto" />
|
||||
<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="auto" uiCulture="auto" enableClientBasedCulture="true"/>
|
||||
<membership defaultProvider="NpgsqlMembershipProvider" userIsOnlineTimeWindow="1">
|
||||
<providers>
|
||||
<clear />
|
||||
|
@ -97,7 +97,6 @@
|
||||
<Folder Include="Models\" />
|
||||
<Folder Include="Scripts\" />
|
||||
<Folder Include="Views\Account\" />
|
||||
<Folder Include="Resources\" />
|
||||
<Folder Include="images\" />
|
||||
<Folder Include="Thanks\" />
|
||||
<Folder Include="Views\Blogs\" />
|
||||
@ -119,6 +118,7 @@
|
||||
<Folder Include="templates\" />
|
||||
<Folder Include="Formatters\" />
|
||||
<Folder Include="install\" />
|
||||
<Folder Include="App_GlobalResources\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Controllers\HomeController.cs" />
|
||||
@ -157,6 +157,12 @@
|
||||
<Compile Include="templates\TexEstimInit.cs" />
|
||||
<Compile Include="Formatters\TexFormatter.cs" />
|
||||
<Compile Include="Formatters\EstimToPdfFormatter.cs" />
|
||||
<Compile Include="App_GlobalResources\LocalizedTextfr.Designer.cs">
|
||||
<DependentUpon>LocalizedText.fr.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="App_GlobalResources\LocalizedText.Designer.cs">
|
||||
<DependentUpon>LocalizedText.resx</DependentUpon>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Views\Web.config" />
|
||||
@ -235,6 +241,9 @@
|
||||
<Content Include="Theme\dark\desc.gif" />
|
||||
<Content Include="Theme\dark\style.css" />
|
||||
<Content Include="Views\FrontOffice\Estimates.aspx" />
|
||||
<Content Include="images\pgsql.png" />
|
||||
<Content Include="Views\Home\ReferencedAssemblies.aspx" />
|
||||
<Content Include="js\rangyinputs-jquery-1.1.2.js" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
|
||||
@ -292,4 +301,14 @@
|
||||
<Name>NpgsqlWorkflow</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="App_GlobalResources\LocalizedText.resx">
|
||||
<Generator>PublicResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>LocalizedText.Designer.cs</LastGenOutput>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="App_GlobalResources\LocalizedText.fr.resx">
|
||||
<Generator>PublicResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>LocalizedTextfr.Designer.cs</LastGenOutput>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
608
web/instdbws.sql
608
web/instdbws.sql
@ -1,4 +1,472 @@
|
||||
|
||||
CREATE TABLE blfiles
|
||||
(
|
||||
_id bigint NOT NULL DEFAULT nextval('bltags__id_seq'::regclass), -- Identifier
|
||||
name character varying(2048), -- File Name, relative to the user home directory, must not begin with a slash.
|
||||
blid bigint, -- Blog entry identifier (foreign key)
|
||||
CONSTRAINT bltags_pkey PRIMARY KEY (_id),
|
||||
CONSTRAINT bltags_blid_fkey FOREIGN KEY (blid)
|
||||
REFERENCES blog (_id) MATCH SIMPLE
|
||||
ON UPDATE CASCADE ON DELETE CASCADE
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
COMMENT ON COLUMN blfiles._id IS 'Identifier';
|
||||
COMMENT ON COLUMN blfiles.name IS 'File Name, relative to the user home directory, must not begin with a slash.';
|
||||
COMMENT ON COLUMN blfiles.blid IS 'Blog entry identifier (foreign key)';
|
||||
|
||||
-- Table: blog
|
||||
|
||||
-- DROP TABLE blog;
|
||||
|
||||
CREATE TABLE blog
|
||||
(
|
||||
applicationname character varying(255) NOT NULL,
|
||||
username character varying(255) NOT NULL,
|
||||
posted timestamp with time zone NOT NULL,
|
||||
modified timestamp with time zone NOT NULL,
|
||||
title character varying(512) NOT NULL,
|
||||
bcontent text NOT NULL,
|
||||
visible boolean NOT NULL,
|
||||
_id bigserial NOT NULL,
|
||||
CONSTRAINT blog_pkey PRIMARY KEY (_id),
|
||||
CONSTRAINT bloguser FOREIGN KEY (applicationname, username)
|
||||
REFERENCES users (applicationname, username) MATCH SIMPLE
|
||||
ON UPDATE CASCADE ON DELETE CASCADE
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
|
||||
-- Table: commandes
|
||||
|
||||
-- DROP TABLE commandes;
|
||||
|
||||
CREATE TABLE commandes
|
||||
(
|
||||
id bigint NOT NULL, -- Identifiant unique de commande e, cours
|
||||
validation date, -- Date de validation
|
||||
prdref character varying(255) NOT NULL, -- Product reference from the unique valid catalog at the validation date
|
||||
CONSTRAINT commandes_pkey PRIMARY KEY (id)
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
COMMENT ON COLUMN commandes.id IS 'Identifiant unique de commande e, cours';
|
||||
COMMENT ON COLUMN commandes.validation IS 'Date de validation';
|
||||
COMMENT ON COLUMN commandes.prdref IS 'Product reference from the unique valid catalog at the validation date';
|
||||
|
||||
-- Table: comment
|
||||
|
||||
-- DROP TABLE comment;
|
||||
|
||||
CREATE TABLE comment
|
||||
(
|
||||
username character varying(255) NOT NULL,
|
||||
bcontent text NOT NULL,
|
||||
posted timestamp with time zone NOT NULL,
|
||||
modified timestamp with time zone NOT NULL,
|
||||
visible boolean NOT NULL,
|
||||
_id bigserial NOT NULL,
|
||||
postid bigint,
|
||||
applicationname character varying(255),
|
||||
CONSTRAINT comment_pkey PRIMARY KEY (_id),
|
||||
CONSTRAINT fkey_blog FOREIGN KEY (postid)
|
||||
REFERENCES blog (_id) MATCH SIMPLE
|
||||
ON UPDATE NO ACTION ON DELETE NO ACTION,
|
||||
CONSTRAINT fkey_users FOREIGN KEY (username, applicationname)
|
||||
REFERENCES users (username, applicationname) MATCH SIMPLE
|
||||
ON UPDATE NO ACTION ON DELETE NO ACTION
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
-- Index: fki_fkey_blog
|
||||
|
||||
-- DROP INDEX fki_fkey_blog;
|
||||
|
||||
CREATE INDEX fki_fkey_blog
|
||||
ON comment
|
||||
USING btree
|
||||
(postid);
|
||||
|
||||
-- Index: fki_fkey_users
|
||||
|
||||
-- DROP INDEX fki_fkey_users;
|
||||
|
||||
CREATE INDEX fki_fkey_users
|
||||
ON comment
|
||||
USING btree
|
||||
(username COLLATE pg_catalog."default", applicationname COLLATE pg_catalog."default");
|
||||
|
||||
|
||||
|
||||
-- Table: estimate
|
||||
|
||||
-- DROP TABLE estimate;
|
||||
|
||||
CREATE TABLE estimate
|
||||
(
|
||||
_id bigserial NOT NULL, -- identifier
|
||||
title character varying(1024) NOT NULL,
|
||||
username character varying(255) NOT NULL, -- User name of the owner and creator for this estimate
|
||||
applicationname character varying(255) NOT NULL,
|
||||
status integer,
|
||||
client character varying(255) NOT NULL, -- a login name
|
||||
description character varying(65000),
|
||||
CONSTRAINT estimate_pkey PRIMARY KEY (_id),
|
||||
CONSTRAINT estimate_client_fkey FOREIGN KEY (client, applicationname)
|
||||
REFERENCES users (username, applicationname) MATCH SIMPLE
|
||||
ON UPDATE CASCADE ON DELETE CASCADE,
|
||||
CONSTRAINT estimate_username_fkey FOREIGN KEY (username, applicationname)
|
||||
REFERENCES users (username, applicationname) MATCH SIMPLE
|
||||
ON UPDATE CASCADE ON DELETE CASCADE
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
COMMENT ON COLUMN estimate._id IS 'identifier';
|
||||
COMMENT ON COLUMN estimate.username IS 'User name of the owner and creator for this estimate';
|
||||
COMMENT ON COLUMN estimate.client IS 'a login name';
|
||||
|
||||
|
||||
-- Index: cliuser
|
||||
|
||||
-- DROP INDEX cliuser;
|
||||
|
||||
CREATE INDEX cliuser
|
||||
ON estimate
|
||||
USING btree
|
||||
(client COLLATE pg_catalog."default", applicationname COLLATE pg_catalog."default");
|
||||
|
||||
|
||||
|
||||
-- Table: histoestim
|
||||
|
||||
-- DROP TABLE histoestim;
|
||||
|
||||
CREATE TABLE histoestim
|
||||
(
|
||||
datechange timestamp with time zone NOT NULL DEFAULT now(),
|
||||
status integer,
|
||||
estid bigint NOT NULL,
|
||||
username character varying(255),
|
||||
applicationname character varying(255),
|
||||
_id bigserial NOT NULL,
|
||||
CONSTRAINT histoestim_pkey PRIMARY KEY (_id),
|
||||
CONSTRAINT histoestim_estid_fkey FOREIGN KEY (estid)
|
||||
REFERENCES estimate (_id) MATCH SIMPLE
|
||||
ON UPDATE CASCADE ON DELETE CASCADE,
|
||||
CONSTRAINT histoestim_username_fkey FOREIGN KEY (username, applicationname)
|
||||
REFERENCES users (username, applicationname) MATCH SIMPLE
|
||||
ON UPDATE NO ACTION ON DELETE NO ACTION
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
|
||||
-- Table: histowritting
|
||||
|
||||
-- DROP TABLE histowritting;
|
||||
|
||||
CREATE TABLE histowritting
|
||||
(
|
||||
datechange timestamp with time zone NOT NULL DEFAULT now(),
|
||||
status integer,
|
||||
wrtid bigint NOT NULL,
|
||||
username character varying(255),
|
||||
applicationname character varying,
|
||||
_id bigserial NOT NULL,
|
||||
CONSTRAINT histowritting_pkey PRIMARY KEY (_id),
|
||||
CONSTRAINT histowritting_username_fkey FOREIGN KEY (username, applicationname)
|
||||
REFERENCES users (username, applicationname) MATCH SIMPLE
|
||||
ON UPDATE NO ACTION ON DELETE NO ACTION,
|
||||
CONSTRAINT histowritting_wrtid_fkey FOREIGN KEY (wrtid)
|
||||
REFERENCES writtings (_id) MATCH SIMPLE
|
||||
ON UPDATE CASCADE ON DELETE CASCADE
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
|
||||
-- Table: hr
|
||||
|
||||
-- DROP TABLE hr;
|
||||
|
||||
CREATE TABLE hr
|
||||
(
|
||||
userid character varying NOT NULL,
|
||||
rate numeric NOT NULL,
|
||||
comment text NOT NULL,
|
||||
CONSTRAINT hr_pk_new PRIMARY KEY (userid)
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
-- Table: product
|
||||
|
||||
-- DROP TABLE product;
|
||||
|
||||
CREATE TABLE product
|
||||
(
|
||||
ref character varying(255) NOT NULL, -- Product reference from the catalog
|
||||
"Name" character varying(1000), -- Product Name
|
||||
"Description" character varying(64000), -- Product description
|
||||
CONSTRAINT product_pkey PRIMARY KEY (ref)
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
COMMENT ON COLUMN product.ref IS 'Product reference from the catalog';
|
||||
COMMENT ON COLUMN product."Name" IS 'Product Name';
|
||||
COMMENT ON COLUMN product."Description" IS 'Product description';
|
||||
|
||||
|
||||
|
||||
|
||||
-- Table: profiledata
|
||||
|
||||
-- DROP TABLE profiledata;
|
||||
|
||||
CREATE TABLE profiledata
|
||||
(
|
||||
uniqueid integer,
|
||||
zipcode character varying(10),
|
||||
cityandstate character varying(255),
|
||||
blogtitle character varying(255), -- Blog Title
|
||||
address character varying(2048), -- Postal address
|
||||
country character varying(100),
|
||||
website character varying(256),
|
||||
blogvisible boolean,
|
||||
hasavatar boolean, -- True when user has specified an image for avatar
|
||||
name character varying(1024),
|
||||
phone character varying(15),
|
||||
mobile character varying(15),
|
||||
accountnumber character varying(15), -- Numero de compte
|
||||
bankedkey integer, -- clé RIB
|
||||
bankcode character varying(5), -- Code banque
|
||||
wicketcode character varying(5),
|
||||
iban character varying(33),
|
||||
bic character varying(15),
|
||||
CONSTRAINT fkprofiles2 FOREIGN KEY (uniqueid)
|
||||
REFERENCES profiles (uniqueid) MATCH SIMPLE
|
||||
ON UPDATE CASCADE ON DELETE CASCADE
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
|
||||
COMMENT ON COLUMN profiledata.blogtitle IS 'Blog Title';
|
||||
COMMENT ON COLUMN profiledata.address IS 'Postal address';
|
||||
COMMENT ON COLUMN profiledata.hasavatar IS 'True when user has specified an image for avatar';
|
||||
COMMENT ON COLUMN profiledata.accountnumber IS 'Numero de compte';
|
||||
COMMENT ON COLUMN profiledata.bankedkey IS 'clé RIB';
|
||||
COMMENT ON COLUMN profiledata.bankcode IS 'Code banque';
|
||||
|
||||
|
||||
-- Index: fki_fkprofiles2
|
||||
|
||||
-- DROP INDEX fki_fkprofiles2;
|
||||
|
||||
CREATE INDEX fki_fkprofiles2
|
||||
ON profiledata
|
||||
USING btree
|
||||
(uniqueid);
|
||||
|
||||
-- Table: profiles
|
||||
|
||||
-- DROP TABLE profiles;
|
||||
|
||||
CREATE TABLE profiles
|
||||
(
|
||||
uniqueid bigserial NOT NULL,
|
||||
username character varying(255) NOT NULL,
|
||||
applicationname character varying(255) NOT NULL,
|
||||
isanonymous boolean,
|
||||
lastactivitydate timestamp with time zone,
|
||||
lastupdateddate timestamp with time zone,
|
||||
CONSTRAINT profiles_pkey PRIMARY KEY (uniqueid),
|
||||
CONSTRAINT pkprofiles UNIQUE (username, applicationname)
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
|
||||
|
||||
-- Table: projet
|
||||
|
||||
-- DROP TABLE projet;
|
||||
|
||||
CREATE TABLE projet
|
||||
(
|
||||
id bigserial NOT NULL,
|
||||
name character varying NOT NULL,
|
||||
prdesc text,
|
||||
managerid character varying NOT NULL,
|
||||
"ApplicationName" character varying(250),
|
||||
CONSTRAINT projet_pk_new PRIMARY KEY (id),
|
||||
CONSTRAINT pk_project_manager FOREIGN KEY (managerid, "ApplicationName")
|
||||
REFERENCES users (username, applicationname) MATCH SIMPLE
|
||||
ON UPDATE NO ACTION ON DELETE NO ACTION
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
|
||||
-- Index: fki_pk_project_manager
|
||||
|
||||
-- DROP INDEX fki_pk_project_manager;
|
||||
|
||||
CREATE INDEX fki_pk_project_manager
|
||||
ON projet
|
||||
USING btree
|
||||
(managerid COLLATE pg_catalog."default", "ApplicationName" COLLATE pg_catalog."default");
|
||||
|
||||
-- Table: roles
|
||||
|
||||
-- DROP TABLE roles;
|
||||
|
||||
CREATE TABLE roles
|
||||
(
|
||||
rolename character varying(255) NOT NULL,
|
||||
applicationname character varying(255) NOT NULL,
|
||||
comment character varying(255) NOT NULL,
|
||||
CONSTRAINT roles_pkey PRIMARY KEY (rolename, applicationname)
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
|
||||
COMMENT ON TABLE roles
|
||||
IS 'Web application roles';
|
||||
|
||||
-- Table: stocksymbols
|
||||
|
||||
-- DROP TABLE stocksymbols;
|
||||
|
||||
CREATE TABLE stocksymbols
|
||||
(
|
||||
uniqueid integer,
|
||||
stocksymbol character varying(10),
|
||||
CONSTRAINT fkprofiles1 FOREIGN KEY (uniqueid)
|
||||
REFERENCES profiles (uniqueid) MATCH SIMPLE
|
||||
ON UPDATE NO ACTION ON DELETE NO ACTION
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
-- Table: tag
|
||||
|
||||
-- DROP TABLE tag;
|
||||
|
||||
CREATE TABLE tag
|
||||
(
|
||||
_id bigserial NOT NULL, -- Identifier
|
||||
name character varying(30), -- Tag name
|
||||
CONSTRAINT tag_pkey PRIMARY KEY (_id),
|
||||
CONSTRAINT tag_name_key UNIQUE (name)
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
|
||||
COMMENT ON COLUMN tag._id IS 'Identifier';
|
||||
COMMENT ON COLUMN tag.name IS 'Tag name';
|
||||
|
||||
|
||||
|
||||
|
||||
-- Table: tagged
|
||||
|
||||
-- DROP TABLE tagged;
|
||||
|
||||
CREATE TABLE tagged
|
||||
(
|
||||
postid bigint NOT NULL,
|
||||
tagid bigint NOT NULL,
|
||||
CONSTRAINT tagged_pkey PRIMARY KEY (postid, tagid),
|
||||
CONSTRAINT tagged_postid_fkey FOREIGN KEY (postid)
|
||||
REFERENCES blog (_id) MATCH SIMPLE
|
||||
ON UPDATE CASCADE ON DELETE CASCADE,
|
||||
CONSTRAINT tagged_tagid_fkey FOREIGN KEY (tagid)
|
||||
REFERENCES tag (_id) MATCH SIMPLE
|
||||
ON UPDATE CASCADE ON DELETE CASCADE
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
|
||||
-- Table: taskdeps
|
||||
|
||||
-- DROP TABLE taskdeps;
|
||||
|
||||
CREATE TABLE taskdeps
|
||||
(
|
||||
"taskId" bigint NOT NULL, -- dependent task
|
||||
deptask bigint NOT NULL, -- Dependency
|
||||
CONSTRAINT pk_tasks_deps PRIMARY KEY ("taskId", deptask),
|
||||
CONSTRAINT pk_foreign_dep FOREIGN KEY (deptask)
|
||||
REFERENCES tasks (id) MATCH SIMPLE
|
||||
ON UPDATE NO ACTION ON DELETE NO ACTION,
|
||||
CONSTRAINT pk_foreign_task FOREIGN KEY ("taskId")
|
||||
REFERENCES tasks (id) MATCH SIMPLE
|
||||
ON UPDATE NO ACTION ON DELETE NO ACTION
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
COMMENT ON TABLE taskdeps
|
||||
IS 'Dependencies between tasks';
|
||||
COMMENT ON COLUMN taskdeps."taskId" IS 'dependent task';
|
||||
COMMENT ON COLUMN taskdeps.deptask IS 'Dependency';
|
||||
|
||||
|
||||
-- Index: fki_pk_foreign_dep
|
||||
|
||||
-- DROP INDEX fki_pk_foreign_dep;
|
||||
|
||||
CREATE INDEX fki_pk_foreign_dep
|
||||
ON taskdeps
|
||||
USING btree
|
||||
(deptask);
|
||||
|
||||
-- Index: fki_pk_foreign_task
|
||||
|
||||
-- DROP INDEX fki_pk_foreign_task;
|
||||
|
||||
CREATE INDEX fki_pk_foreign_task
|
||||
ON taskdeps
|
||||
USING btree
|
||||
("taskId");
|
||||
|
||||
|
||||
|
||||
-- Table: tasks
|
||||
|
||||
-- DROP TABLE tasks;
|
||||
|
||||
CREATE TABLE tasks
|
||||
(
|
||||
id bigserial NOT NULL,
|
||||
name character varying NOT NULL,
|
||||
start date NOT NULL,
|
||||
endd date NOT NULL,
|
||||
tdesc text NOT NULL,
|
||||
prid bigint NOT NULL,
|
||||
CONSTRAINT tasks_pk_new PRIMARY KEY (id),
|
||||
CONSTRAINT tasks_fk_new FOREIGN KEY (prid)
|
||||
REFERENCES projet (id) MATCH SIMPLE
|
||||
ON UPDATE NO ACTION ON DELETE NO ACTION
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
|
||||
-- Table: users
|
||||
|
||||
-- DROP TABLE users;
|
||||
|
||||
CREATE TABLE users
|
||||
(
|
||||
pkid character varying NOT NULL,
|
||||
@ -10,59 +478,125 @@ CREATE TABLE users
|
||||
passwordquestion character varying(255),
|
||||
passwordanswer character varying(255),
|
||||
isapproved boolean,
|
||||
lastactivitydate date,
|
||||
lastlogindate date,
|
||||
lastpasswordchangeddate date,
|
||||
creationdate date,
|
||||
isonline boolean,
|
||||
lastactivitydate timestamp with time zone,
|
||||
lastlogindate timestamp with time zone,
|
||||
lastpasswordchangeddate timestamp with time zone,
|
||||
creationdate timestamp with time zone,
|
||||
islockedout boolean,
|
||||
lastlockedoutdate date,
|
||||
lastlockedoutdate timestamp with time zone,
|
||||
failedpasswordattemptcount integer,
|
||||
failedpasswordattemptwindowstart date,
|
||||
failedpasswordattemptwindowstart timestamp with time zone,
|
||||
failedpasswordanswerattemptcount integer,
|
||||
failedpasswordanswerattemptwindowstart date,
|
||||
CONSTRAINT users_pkey PRIMARY KEY (pkid ),
|
||||
CONSTRAINT uniquelogin UNIQUE (applicationname, email ),
|
||||
CONSTRAINT uniquemail UNIQUE (applicationname, username )
|
||||
failedpasswordanswerattemptwindowstart timestamp with time zone,
|
||||
CONSTRAINT users_pkey PRIMARY KEY (pkid),
|
||||
CONSTRAINT uniquelogin UNIQUE (applicationname, email),
|
||||
CONSTRAINT uniquemail UNIQUE (applicationname, username)
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
|
||||
-- Table: roles
|
||||
|
||||
-- DROP TABLE roles;
|
||||
|
||||
CREATE TABLE roles
|
||||
(
|
||||
rolename character varying(255) NOT NULL,
|
||||
applicationname character varying(255) NOT NULL,
|
||||
comment character varying(255) NOT NULL,
|
||||
CONSTRAINT roles_pkey PRIMARY KEY (rolename , applicationname )
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
COMMENT ON TABLE roles
|
||||
IS 'Web application roles';
|
||||
|
||||
-- Table: usersroles
|
||||
-- Table: usersroles
|
||||
|
||||
-- DROP TABLE usersroles;
|
||||
|
||||
CREATE TABLE usersroles
|
||||
(
|
||||
applicationname character varying (255) NOT NULL,
|
||||
rolename character varying (255) NOT NULL,
|
||||
username character varying (255) NOT NULL,
|
||||
CONSTRAINT attrroles_pkey PRIMARY KEY (applicationname, rolename , username ),
|
||||
CONSTRAINT usersroles_fk_role FOREIGN KEY (applicationname,rolename)
|
||||
REFERENCES roles (applicationname,rolename) MATCH SIMPLE
|
||||
applicationname character varying(255) NOT NULL,
|
||||
rolename character varying(255) NOT NULL,
|
||||
username character varying(255) NOT NULL,
|
||||
CONSTRAINT attrroles_pkey PRIMARY KEY (applicationname, rolename, username),
|
||||
CONSTRAINT usersroles_fk_role FOREIGN KEY (applicationname, rolename)
|
||||
REFERENCES roles (applicationname, rolename) MATCH SIMPLE
|
||||
ON UPDATE CASCADE ON DELETE CASCADE,
|
||||
CONSTRAINT usersroles_fk_user FOREIGN KEY (applicationname,username)
|
||||
REFERENCES users (applicationname,username) MATCH SIMPLE
|
||||
CONSTRAINT usersroles_fk_user FOREIGN KEY (applicationname, username)
|
||||
REFERENCES users (applicationname, username) MATCH SIMPLE
|
||||
ON UPDATE CASCADE ON DELETE CASCADE
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
|
||||
-- Table: wrfiles
|
||||
|
||||
-- DROP TABLE wrfiles;
|
||||
|
||||
CREATE TABLE wrfiles
|
||||
(
|
||||
_id bigint NOT NULL DEFAULT nextval('wrtags__id_seq'::regclass), -- Identifier
|
||||
name character varying(2048), -- File Name, relative to the user home directory, must not begin with a slash.
|
||||
wrid bigint, -- Writting identifier (foreign key)
|
||||
CONSTRAINT wrtags_pkey PRIMARY KEY (_id),
|
||||
CONSTRAINT wrtags_wrid_fkey FOREIGN KEY (wrid)
|
||||
REFERENCES writtings (_id) MATCH SIMPLE
|
||||
ON UPDATE CASCADE ON DELETE CASCADE
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
|
||||
COMMENT ON COLUMN wrfiles._id IS 'Identifier';
|
||||
COMMENT ON COLUMN wrfiles.name IS 'File Name, relative to the user home directory, must not begin with a slash.';
|
||||
COMMENT ON COLUMN wrfiles.wrid IS 'Writting identifier (foreign key)';
|
||||
|
||||
|
||||
|
||||
-- Table: writtings
|
||||
|
||||
-- DROP TABLE writtings;
|
||||
|
||||
CREATE TABLE writtings
|
||||
(
|
||||
_id bigserial NOT NULL, -- identifier
|
||||
count integer, -- multiplier
|
||||
estimid bigint NOT NULL, -- Estimaton identifier
|
||||
description character varying(2047), -- item textual description
|
||||
productid character varying(512), -- Product reference ... may be a key in a catalog, may contain a catalog id
|
||||
ucost numeric(8,2), -- en euro.?
|
||||
CONSTRAINT writtings_pkey PRIMARY KEY (_id),
|
||||
CONSTRAINT writtings_estimid_fkey FOREIGN KEY (estimid)
|
||||
REFERENCES estimate (_id) MATCH SIMPLE
|
||||
ON UPDATE CASCADE ON DELETE CASCADE
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
|
||||
COMMENT ON COLUMN writtings._id IS 'identifier';
|
||||
COMMENT ON COLUMN writtings.count IS 'multiplier';
|
||||
COMMENT ON COLUMN writtings.estimid IS 'Estimaton identifier';
|
||||
COMMENT ON COLUMN writtings.description IS 'item textual description';
|
||||
COMMENT ON COLUMN writtings.productid IS 'Product reference ... may be a key in a catalog, may contain a catalog id';
|
||||
COMMENT ON COLUMN writtings.ucost IS 'en euro.?';
|
||||
|
||||
|
||||
-- Table: wrtags
|
||||
|
||||
-- DROP TABLE wrtags;
|
||||
|
||||
CREATE TABLE wrtags
|
||||
(
|
||||
wrid bigint NOT NULL,
|
||||
tagid bigint NOT NULL,
|
||||
CONSTRAINT wrtags_pkey1 PRIMARY KEY (wrid, tagid),
|
||||
CONSTRAINT cstwrtagsref FOREIGN KEY (tagid)
|
||||
REFERENCES tag (_id) MATCH SIMPLE
|
||||
ON UPDATE NO ACTION ON DELETE NO ACTION,
|
||||
CONSTRAINT wrtags_wrid_fkey1 FOREIGN KEY (wrid)
|
||||
REFERENCES writtings (_id) MATCH SIMPLE
|
||||
ON UPDATE NO ACTION ON DELETE NO ACTION
|
||||
)
|
||||
WITH (
|
||||
OIDS=FALSE
|
||||
);
|
||||
|
||||
-- Index: fki_cstwrtagsref
|
||||
|
||||
-- DROP INDEX fki_cstwrtagsref;
|
||||
|
||||
CREATE INDEX fki_cstwrtagsref
|
||||
ON wrtags
|
||||
USING btree
|
||||
(tagid);
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user