diff --git a/GanjooRazor/Areas/Admin/Pages/ReviewPersonEdits.cshtml b/GanjooRazor/Areas/Admin/Pages/ReviewPersonEdits.cshtml
index 1216683e..0bb40291 100644
--- a/GanjooRazor/Areas/Admin/Pages/ReviewPersonEdits.cshtml
+++ b/GanjooRazor/Areas/Admin/Pages/ReviewPersonEdits.cshtml
@@ -113,6 +113,11 @@ else
@Model.ImportanceLabel(p.Importance)
@Model.ImportanceLabel(s.SuggestedImportance)
+
+ جنسیت
+ @Model.GenderLabel(p.Gender)
+ @Model.GenderLabel(s.SuggestedGender)
+
توضیحات
@p.Description
diff --git a/GanjooRazor/Areas/Admin/Pages/ReviewPersonEdits.cshtml.cs b/GanjooRazor/Areas/Admin/Pages/ReviewPersonEdits.cshtml.cs
index 93ab2129..87afec0f 100644
--- a/GanjooRazor/Areas/Admin/Pages/ReviewPersonEdits.cshtml.cs
+++ b/GanjooRazor/Areas/Admin/Pages/ReviewPersonEdits.cshtml.cs
@@ -69,6 +69,19 @@ namespace GanjooRazor.Areas.Admin.Pages
}
}
+ public string GenderLabel(PersonGender gender)
+ {
+ switch (gender)
+ {
+ case PersonGender.Male:
+ return "مرد";
+ case PersonGender.Female:
+ return "زن";
+ default:
+ return "نامشخص";
+ }
+ }
+
public IActionResult OnPost()
{
Skip = string.IsNullOrEmpty(Request.Query["skip"]) ? 0 : int.Parse(Request.Query["skip"]);
diff --git a/GanjooRazor/Areas/User/Pages/Editor.cshtml b/GanjooRazor/Areas/User/Pages/Editor.cshtml
index fc488fe8..b8a85f63 100644
--- a/GanjooRazor/Areas/User/Pages/Editor.cshtml
+++ b/GanjooRazor/Areas/User/Pages/Editor.cshtml
@@ -561,7 +561,8 @@
birthLocationId: null,
deathLocationId: null,
familyTreeCaption: $('#geotag-new-person-familytreecaption').val() || null,
- importance: $('#geotag-new-person-importance').val()
+ importance: $('#geotag-new-person-importance').val(),
+ gender: $('#geotag-new-person-gender').val()
};
var relatedPeople = [];
@@ -854,6 +855,7 @@
$('#geotag-new-person-wikiurl').val('');
$('#geotag-new-person-familytreecaption').val('');
$('#geotag-new-person-importance').val('Normal');
+ $('#geotag-new-person-gender').val('Unknown');
$('#geotag-person-relatives-list').empty();
if (document.getElementById('new-person-widget').style.display !== 'none') {
toggleNewPersonWidget();
@@ -2691,6 +2693,15 @@ else
فقط اندازهٔ نمایش این نامبرده را در نمودار شخصیتها تعیین میکند.
+
+
جنسیت
+
+ نامشخص
+ مرد
+ زن
+
+
فقط در ترسیم نمودار تبارنامه استفاده میشود (برای تشخیص اینکه کدام والد به عنوان ادامهٔ اصلی شاخهٔ خانوادگی رسم شود).
+
اگر خویشاوندی یا وابستگی این نامبرده با نامبردۀ دیگری را میدانید، میتوانید همینجا اضافه کنید (نامبردۀ دیگر باید از قبل در فهرست موجود باشد؛
diff --git a/GanjooRazor/Areas/User/Pages/SuggestPersonEdit.cshtml b/GanjooRazor/Areas/User/Pages/SuggestPersonEdit.cshtml
index e1f1ace0..0bf2f1cf 100644
--- a/GanjooRazor/Areas/User/Pages/SuggestPersonEdit.cshtml
+++ b/GanjooRazor/Areas/User/Pages/SuggestPersonEdit.cshtml
@@ -78,6 +78,19 @@ else
+
+
+ جنسیت:
+ صِرفاً در ترسیم نمودار تبارنامه استفاده میشود (برای تشخیص اینکه کدام والد به عنوان ادامهٔ اصلی شاخهٔ خانوادگی رسم شود)؛ در هیچ فهرست یا جستجویی تأثیری ندارد.
+
+
+
+ نامشخص
+ مرد
+ زن
+
+
+
توضیحات:
diff --git a/GanjooRazor/Areas/User/Pages/SuggestPersonEdit.cshtml.cs b/GanjooRazor/Areas/User/Pages/SuggestPersonEdit.cshtml.cs
index 6ef494c4..1761e4b1 100644
--- a/GanjooRazor/Areas/User/Pages/SuggestPersonEdit.cshtml.cs
+++ b/GanjooRazor/Areas/User/Pages/SuggestPersonEdit.cshtml.cs
@@ -90,6 +90,7 @@ namespace GanjooRazor.Areas.User.Pages
SuggestedDeathLocationId = Person.DeathLocationId,
SuggestedFamilyTreeCaption = Person.FamilyTreeCaption,
SuggestedImportance = Person.Importance,
+ SuggestedGender = Person.Gender,
};
}
diff --git a/GanjooRazor/wwwroot/js/familytree.js b/GanjooRazor/wwwroot/js/familytree.js
index d1b76a2f..462fe320 100644
--- a/GanjooRazor/wwwroot/js/familytree.js
+++ b/GanjooRazor/wwwroot/js/familytree.js
@@ -79,8 +79,21 @@
allIds.forEach(function (id) { isRoot[id] = !parentsOf[id] || parentsOf[id].length === 0; });
// one child can have two recorded parents (mother + father) - pick a single "primary"
- // parent per child to build a drawable tree, preferring whichever parent is NOT themselves
- // a chart-root (so the root-level spouse ends up as the "attached" side, see below)
+ // parent per child to build a drawable tree. Preference order:
+ // 1) whichever parent is NOT themselves a chart-root (so the tree keeps following a
+ // documented lineage instead of dead-ending at a root with no known ancestors) -
+ // the root-level parent then ends up as the "attached" side, see below;
+ // 2) if that's a tie (both parents are roots, or both have their own recorded
+ // ancestors - common in legendary/mythological genealogies where both sides are
+ // fully documented), prefer the father (PersonGender.Male = 1), matching
+ // conventional patrilineal genealogy-chart practice;
+ // 3) if gender doesn't resolve it either (same gender, or neither recorded), fall back
+ // to ascending person id, just to be deterministic - this last step has no meaning
+ // of its own and is only a last resort.
+ function genderRank(id) {
+ var g = (persons[id] && persons[id].gender) || 0;
+ return g === 1 ? 0 : (g === 2 ? 1 : 2); // Male first, then Female, then Unknown
+ }
var primaryParentOf = {};
var secondaryParentOf = {};
allIds.forEach(function (childId) {
@@ -90,6 +103,8 @@
var sorted = ps.slice().sort(function (a, b) {
var ar = isRoot[a] ? 1 : 0, br = isRoot[b] ? 1 : 0;
if (ar !== br) return ar - br;
+ var ag = genderRank(a), bg = genderRank(b);
+ if (ag !== bg) return ag - bg;
return a - b;
});
primaryParentOf[childId] = sorted[0];
@@ -202,6 +217,9 @@
return { w: baseW + bump.w, h: baseH + bump.h };
}
+ // 0=Normal (regular weight), 1=Important (semi-bold), 2=VeryImportant (bold)
+ var IMPORTANCE_FONT_WEIGHT = { 0: 400, 1: 600, 2: 700 };
+
function renderFamilyTree(containerId, svgId, tooltipId, data, requestedRootId) {
var container = document.getElementById(containerId);
var svg = document.getElementById(svgId);
@@ -264,8 +282,12 @@
'class': isRequested ? 'ft-box ft-box-current' : 'ft-box'
});
g.appendChild(rect);
+ // same importance->weight idea as the width/height bump above - Important/VeryImportant
+ // names are drawn bolder, not just in a bigger box, so they stand out at a glance
+ var fontWeight = IMPORTANCE_FONT_WEIGHT[(p && p.importance) || 0] || IMPORTANCE_FONT_WEIGHT[0];
var text = el('text', {
- x: x, y: y + 5, 'text-anchor': 'middle', 'class': 'ft-box-text', direction: 'rtl'
+ x: x, y: y + 5, 'text-anchor': 'middle', 'class': 'ft-box-text', direction: 'rtl',
+ style: 'font-weight:' + fontWeight
});
text.textContent = personLabel(p);
g.appendChild(text);
diff --git a/RMuseum/Migrations/20261003143457_AddPersonGender.Designer.cs b/RMuseum/Migrations/20261003143457_AddPersonGender.Designer.cs
new file mode 100644
index 00000000..ccf9cd35
--- /dev/null
+++ b/RMuseum/Migrations/20261003143457_AddPersonGender.Designer.cs
@@ -0,0 +1,6628 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using RMuseum.DbContext;
+
+#nullable disable
+
+namespace RMuseum.Migrations
+{
+ [DbContext(typeof(RMuseumDbContext))]
+ [Migration("20261003143457_AddPersonGender")]
+ partial class AddPersonGender
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "10.0.11")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+ SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("ClaimType")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ClaimValue")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("RoleId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetRoleClaims", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("ClaimType")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ClaimValue")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("UserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserClaims", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.Property("LoginProvider")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("ProviderKey")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("ProviderDisplayName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("UserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("LoginProvider", "ProviderKey");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserLogins", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.Property("UserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("RoleId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("UserId", "RoleId");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetUserRoles", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.Property("UserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("LoginProvider")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("Name")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("Value")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("UserId", "LoginProvider", "Name");
+
+ b.ToTable("AspNetUserTokens", (string)null);
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Accounting.DonationExpenditure", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Amount")
+ .HasColumnType("decimal(18,2)");
+
+ b.Property("GanjoorDonationId")
+ .HasColumnType("int");
+
+ b.Property("GanjoorExpenseId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GanjoorDonationId");
+
+ b.HasIndex("GanjoorExpenseId");
+
+ b.ToTable("DonationExpenditure");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Accounting.GanjoorDonation", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Amount")
+ .HasColumnType("decimal(18,2)");
+
+ b.Property("AmountString")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("DateString")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("DonorLink")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("DonorName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ExpenditureDesc")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ImportedRecord")
+ .HasColumnType("bit");
+
+ b.Property("RecordDate")
+ .HasColumnType("datetime2");
+
+ b.Property("Remaining")
+ .HasColumnType("decimal(18,2)");
+
+ b.Property("Unit")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("GanjoorDonations");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Accounting.GanjoorExpense", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Amount")
+ .HasColumnType("decimal(18,2)");
+
+ b.Property("Description")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ExpenseDate")
+ .HasColumnType("datetime2");
+
+ b.Property("Unit")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("GanjoorExpenses");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Artifact.RArtifactItemRecord", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CoverImageIndex")
+ .HasColumnType("int");
+
+ b.Property("Description")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("DescriptionInEnglish")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("FriendlyUrl")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("LastModified")
+ .HasColumnType("datetime2");
+
+ b.Property("Name")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("NameInEnglish")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Order")
+ .HasColumnType("int");
+
+ b.Property("RArtifactMasterRecordId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("RArtifactMasterRecordId", "FriendlyUrl")
+ .IsUnique()
+ .HasFilter("[FriendlyUrl] IS NOT NULL");
+
+ b.HasIndex("RArtifactMasterRecordId", "Order")
+ .IsUnique();
+
+ b.ToTable("Items");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Artifact.RArtifactMasterRecord", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CoverImageId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CoverItemIndex")
+ .HasColumnType("int");
+
+ b.Property("DateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("Description")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("DescriptionInEnglish")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("FriendlyUrl")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("ItemCount")
+ .HasColumnType("int");
+
+ b.Property("LastModified")
+ .HasColumnType("datetime2");
+
+ b.Property("Name")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("NameInEnglish")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Status")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CoverImageId");
+
+ b.HasIndex("FriendlyUrl")
+ .IsUnique()
+ .HasFilter("[FriendlyUrl] IS NOT NULL");
+
+ b.HasIndex("LastModified");
+
+ b.HasIndex("CoverItemIndex", "Status");
+
+ b.ToTable("Artifacts");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Artifact.RTag", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("FriendlyUrl")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("GlobalValue")
+ .HasColumnType("bit");
+
+ b.Property("Name")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("NameInEnglish")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Order")
+ .HasColumnType("int");
+
+ b.Property("PluralName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("PluralNameInEnglish")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Status")
+ .HasColumnType("int");
+
+ b.Property("TagType")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FriendlyUrl");
+
+ b.ToTable("Tags");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Artifact.RTagValue", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("BookId")
+ .HasColumnType("int");
+
+ b.Property("FriendlyUrl")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("Order")
+ .HasColumnType("int");
+
+ b.Property("PDFBookId")
+ .HasColumnType("int");
+
+ b.Property("PDFPageId")
+ .HasColumnType("int");
+
+ b.Property("RArtifactItemRecordId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("RArtifactMasterRecordId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("RTagId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Status")
+ .HasColumnType("int");
+
+ b.Property("Value")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ValueInEnglish")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ValueSupplement")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BookId");
+
+ b.HasIndex("FriendlyUrl");
+
+ b.HasIndex("PDFBookId");
+
+ b.HasIndex("PDFPageId");
+
+ b.HasIndex("RArtifactItemRecordId");
+
+ b.HasIndex("RArtifactMasterRecordId");
+
+ b.HasIndex("RTagId");
+
+ b.ToTable("TagValues");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Bookmark.RUserBookmark", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("DateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("Note")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("RAppUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("RArtifactItemRecordId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("RArtifactMasterRecordId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("RBookmarkType")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("RAppUserId");
+
+ b.HasIndex("RArtifactItemRecordId");
+
+ b.HasIndex("RArtifactMasterRecordId");
+
+ b.ToTable("UserBookmarks");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.ExternalFTPUpload.QueuedFTPUpload", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("DeleteFileAfterUpload")
+ .HasColumnType("bit");
+
+ b.Property("Error")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("LocalFilePath")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ProcessDate")
+ .HasColumnType("datetime2");
+
+ b.Property("Processing")
+ .HasColumnType("bit");
+
+ b.Property("QueueDate")
+ .HasColumnType("datetime2");
+
+ b.Property("RemoteFilePath")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("QueuedFTPUploads");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.FAQ.FAQCategory", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("CatOrder")
+ .HasColumnType("int");
+
+ b.Property("Description")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Published")
+ .HasColumnType("bit");
+
+ b.Property("Title")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("FAQCategories");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.FAQ.FAQItem", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("AnswerExcerpt")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("CategoryId")
+ .HasColumnType("int");
+
+ b.Property("ContentForSearch")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("FullAnswer")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("HashTag1")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("HashTag2")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("HashTag3")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("HashTag4")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ItemOrderInCategory")
+ .HasColumnType("int");
+
+ b.Property("Pinned")
+ .HasColumnType("bit");
+
+ b.Property("PinnedItemOrder")
+ .HasColumnType("int");
+
+ b.Property("Published")
+ .HasColumnType("bit");
+
+ b.Property("Question")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CategoryId");
+
+ b.ToTable("FAQItems");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Ganjoor.CategoryWordCount", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CatId")
+ .HasColumnType("int");
+
+ b.Property("Count")
+ .HasColumnType("int");
+
+ b.Property("RowNmbrInCat")
+ .HasColumnType("int");
+
+ b.Property("Word")
+ .HasColumnType("nvarchar(450)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CatId", "Word")
+ .IsUnique()
+ .HasFilter("[Word] IS NOT NULL");
+
+ b.ToTable("CategoryWordCounts");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Ganjoor.CategoryWordCountSummary", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CatId")
+ .HasColumnType("int");
+
+ b.Property("TotalWordCount")
+ .HasColumnType("int");
+
+ b.Property("UniqueWordCount")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CatId")
+ .IsUnique();
+
+ b.ToTable("CategoryWordCountSummaries");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Ganjoor.DigitalSource", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("CoupletsCount")
+ .HasColumnType("int");
+
+ b.Property("FullName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ShortName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("SourceType")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("UrlSlug")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("DigitalSources");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Ganjoor.DiscoverQuotedQueueItem", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("PoemId")
+ .HasColumnType("int");
+
+ b.Property("PoetId")
+ .HasColumnType("int");
+
+ b.Property("RelatedPoemId")
+ .HasColumnType("int");
+
+ b.Property("RelatedPoetId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.ToTable("DiscoverQuotedQueueItems");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorCachedRelatedPoem", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("FullTitle")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("FullUrl")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("HtmlExcerpt")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("PoemId")
+ .HasColumnType("int");
+
+ b.Property("PoetId")
+ .HasColumnType("int");
+
+ b.Property("PoetImageUrl")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("PoetMorePoemsLikeThisCount")
+ .HasColumnType("int");
+
+ b.Property("PoetName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("RelationOrder")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FullUrl");
+
+ b.HasIndex("PoemId");
+
+ b.ToTable("GanjoorCachedRelatedPoems");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorCachedRelatedSection", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("FullTitle")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("FullUrl")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("HtmlExcerpt")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("PoemId")
+ .HasColumnType("int");
+
+ b.Property("PoetId")
+ .HasColumnType("int");
+
+ b.Property("PoetImageUrl")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("PoetMorePoemsLikeThisCount")
+ .HasColumnType("int");
+
+ b.Property("PoetName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("RelationOrder")
+ .HasColumnType("int");
+
+ b.Property("SectionIndex")
+ .HasColumnType("int");
+
+ b.Property("TargetPoemId")
+ .HasColumnType("int");
+
+ b.Property("TargetSectionIndex")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PoemId", "SectionIndex");
+
+ b.ToTable("GanjoorCachedRelatedSections");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorCat", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("int");
+
+ b.Property("BookName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("CatType")
+ .HasColumnType("int");
+
+ b.Property("Description")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("DescriptionHtml")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("FullUrl")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("MapName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("MixedModeOrder")
+ .HasColumnType("int");
+
+ b.Property("ParentId")
+ .HasColumnType("int");
+
+ b.Property("PoetId")
+ .HasColumnType("int");
+
+ b.Property("Published")
+ .HasColumnType("bit");
+
+ b.Property("RImageId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("SumUpSubsGeoLocations")
+ .HasColumnType("bit");
+
+ b.Property("TableOfContentsStyle")
+ .HasColumnType("int");
+
+ b.Property("Title")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("UrlSlug")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FullUrl");
+
+ b.HasIndex("PoetId");
+
+ b.HasIndex("RImageId");
+
+ b.HasIndex("ParentId", "PoetId");
+
+ SqlServerIndexBuilderExtensions.IncludeProperties(b.HasIndex("ParentId", "PoetId"), new[] { "Id" });
+
+ b.ToTable("GanjoorCategories");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorCatCorrection", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("AffectedTheCat")
+ .HasColumnType("bit");
+
+ b.Property("ApplicationOrder")
+ .HasColumnType("int");
+
+ b.Property("CatId")
+ .HasColumnType("int");
+
+ b.Property("Date")
+ .HasColumnType("datetime2");
+
+ b.Property("Description")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("DescriptionHtml")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("HideMyName")
+ .HasColumnType("bit");
+
+ b.Property("Note")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("OriginalDescription")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("OriginalDescriptionHtml")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("PageId")
+ .HasColumnType("int");
+
+ b.Property("Result")
+ .HasColumnType("int");
+
+ b.Property("ReviewDate")
+ .HasColumnType("datetime2");
+
+ b.Property("ReviewNote")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Reviewed")
+ .HasColumnType("bit");
+
+ b.Property("ReviewerUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("UserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CatId");
+
+ b.HasIndex("ReviewerUserId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("GanjoorCatCorrections");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorCentury", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("EndYear")
+ .HasColumnType("int");
+
+ b.Property("HalfCenturyOrder")
+ .HasColumnType("int");
+
+ b.Property("Name")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ShowInTimeLine")
+ .HasColumnType("bit");
+
+ b.Property("StartYear")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.ToTable("GanjoorCenturies");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorCenturyPoet", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("GanjoorCenturyId")
+ .HasColumnType("int");
+
+ b.Property("PoetId")
+ .HasColumnType("int");
+
+ b.Property("PoetOrder")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GanjoorCenturyId");
+
+ b.HasIndex("PoetId");
+
+ b.ToTable("GanjoorCenturyPoet");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorComment", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("AuthorEmail")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("AuthorIpAddress")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("AuthorName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("AuthorUrl")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("CommentDate")
+ .HasColumnType("datetime2");
+
+ b.Property("CoupletIndex")
+ .HasColumnType("int");
+
+ b.Property("DislikeCount")
+ .HasColumnType("int");
+
+ b.Property("HtmlComment")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("InReplyToId")
+ .HasColumnType("int");
+
+ b.Property("LikeCount")
+ .HasColumnType("int");
+
+ b.Property("PoemId")
+ .HasColumnType("int");
+
+ b.Property("SortKey")
+ .HasColumnType("int");
+
+ b.Property("Status")
+ .HasColumnType("int");
+
+ b.Property("UserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Verse12d")
+ .HasColumnType("int");
+
+ b.Property("Verse1Id")
+ .HasColumnType("int");
+
+ b.Property("Verse2Id")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CommentDate");
+
+ b.HasIndex("InReplyToId");
+
+ b.HasIndex("Status");
+
+ b.HasIndex("UserId");
+
+ b.HasIndex("Verse1Id");
+
+ b.HasIndex("Verse2Id");
+
+ b.HasIndex("PoemId", "CommentDate");
+
+ b.HasIndex("PoemId", "SortKey");
+
+ b.ToTable("GanjoorComments");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorCommentAbuseReport", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("GanjoorCommentId")
+ .HasColumnType("int");
+
+ b.Property("ReasonCode")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ReasonText")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ReportedById")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GanjoorCommentId");
+
+ b.HasIndex("ReportedById");
+
+ b.ToTable("GanjoorReportedComments");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorCommentReaction", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("GanjoorCommentId")
+ .HasColumnType("int");
+
+ b.Property("PoemId")
+ .HasColumnType("int");
+
+ b.Property