diff --git a/auctions/models.py b/auctions/models.py index 50fcf3b..0528117 100755 --- a/auctions/models.py +++ b/auctions/models.py @@ -1317,6 +1317,20 @@ def location_link(self): return reverse("edit_pickup", kwargs={"pk": self.location_qs.first().pk}) return reverse("auction_pickup_location", kwargs={"slug": self.slug}) + @property + def video_tutorial(self): + if self.is_online: + return settings.ONLINE_TUTORIAL_YOUTUBE_ID + else: + return settings.IN_PERSON_TUTORIAL_YOUTUBE_ID + + @property + def video_tutorial_chapters(self): + if self.is_online: + return settings.ONLINE_TUTORIAL_CHAPTERS + else: + return settings.IN_PERSON_TUTORIAL_CHAPTERS + class PickupLocation(models.Model): """ diff --git a/auctions/templates/auction_help.html b/auctions/templates/auction_help.html new file mode 100755 index 0000000..a8e0ae7 --- /dev/null +++ b/auctions/templates/auction_help.html @@ -0,0 +1,29 @@ +{% extends "base.html" %} +{% block title %}Help for {{ auction }}{% endblock %} +{% load static %} +{% block content %} + {% include 'auction_ribbon.html' %} +
Help and support
+
+ This video will walk you through the entire process of running your auction. +
+ {% include 'youtube_embed.html' with videoId=auction.video_tutorial chapters=auction.video_tutorial_chapters %} +
+
Still got questions?
+ The FAQ covers nearly all questions

+

+
+
Found a bug? Got a request for a new feature?
+ Open a GitHub issue
+ Github is the best place to report issues and suggest features, as other uses can provide feedback.

+

+
+
Still need help?
+ Contact me at {{ admin_email | urlize }}
+ Please, watch the video and read the FAQ before emailing. This is a volunteer-run project and help is provided on a limited basis. +
+ + +{% endblock %} +{% block extra_js %} +{% endblock %} diff --git a/auctions/templates/auction_ribbon.html b/auctions/templates/auction_ribbon.html index 7f02a7d..25558a5 100644 --- a/auctions/templates/auction_ribbon.html +++ b/auctions/templates/auction_ribbon.html @@ -17,7 +17,8 @@

{{auction}}

  • {% if auction.admin_checklist_additional_admin %}{% else %}{%endif%} Click a name to edit that user and add an additional admin to help you set lot winners
  • {% endif %} - This message will disappear once you've finished setting up your auction. +
    Having trouble? Click here to get help
    + This message will disappear once you've finished setting up your auction. {% endif %} {% endif %} @@ -38,7 +39,7 @@

    {{auction}}

    Location{% if auction.location_qs|length > 1 %}s{% endif %} Set lot winners Chat messages - Help and Support + Help and Support Copy to new auction Stats {% if not auction.is_online %} Print labels{% endif %} diff --git a/auctions/templates/promo.html b/auctions/templates/promo.html index 04d0d9d..6216c76 100755 --- a/auctions/templates/promo.html +++ b/auctions/templates/promo.html @@ -160,110 +160,108 @@
    This site provides all the tools you need to run traditional, in-person auct

    - -

    Easy to use. Better for everyone.

    -
    -
    -
    Online auctions benefit everyone
    -
    -

    Buyers and sellers

    -

    Don't buy big fish

    -

    Take your time and research items before you bid -

    Set a minimum bid, so your items always sell for what they're worth

    -

    No need to pack and transport unsold items

    -

    +
    +
    +
    Online auctions benefit everyone
    +
    +

    Buyers and sellers

    +

    Don't buy big fish

    +

    Take your time and research items before you bid +

    Set a minimum bid, so your items always sell for what they're worth

    +

    No need to pack and transport unsold items

    +

    +
    -
    -
    -
    -
    A game-changer for clubs
    -
    -

    Clubs

    -

    -

    Attract new members

    -

    No location rental costs

    -

    No auctioneer costs

    -

    Save time and hassle setting up

    -

    +
    +
    +
    A game-changer for clubs
    +
    +

    Clubs

    +

    +

    Attract new members

    +

    No location rental costs

    +

    No auctioneer costs

    +

    Save time and hassle setting up

    +

    +
    -
    -
    -
    -
    Your auction, your way
    -
    -

    Pants optional

    -

    - Bid from the comfort of your home
    -

    Don't drink and bid

    - Sturgeon general's warning: consumption of alcohol while bidding may be - beneficial to your club's finances

    -

    +
    +
    +
    Your auction, your way
    +
    +

    Pants optional

    +

    + Bid from the comfort of your home
    +

    Don't drink and bid

    + Sturgeon general's warning: consumption of alcohol while bidding may be + beneficial to your club's finances

    +

    +
    +

    Awesome.

    -

    Awesome.

    -
    -
    -
    -
    +
    +
    -
    -
    -
    -

    I was reluctant at first, but after buying and selling, I am convinced this is the next generation of fish auctions. I love the fact my fish don't sit on a cold table all day long.

    -
    - -
    -
    -
    -
    -
    -

    Amazing! The best auction software I've ever seen

    -
    - -
    -
    -
    -
    -
    -

    This electronic age shit sucks !!!

    -
    - -
    -
    -
    - - +
    +
    +
    +
    +

    I was reluctant at first, but after buying and selling, I am convinced this is the next generation of fish auctions. I love the fact my fish don't sit on a cold table all day long.

    +
    + +
    +
    +
    +
    +
    +

    Amazing! The best auction software I've ever seen

    +
    + +
    +
    +
    +
    +
    +

    This electronic age shit sucks !!!

    +
    + +
    +
    +
    +
    + {% include 'youtube_embed.html' with videoId=online_tutorial chapters=online_tutorial_chapters %}
    -
    -
    - +

    All the software you need to run an in-person auction

    • Manage users and lots
    • Quickly and easily set lot winners
    • -
    • Get help from friends* to run the auction
      - *Friends not included -- you'll have to make some along the way
    • +
    • Minimum bid (reserve) and buy now prices
    • +
    • Using a projector, show pictures of a lot as it's being auctioned off
    • +
    • Support for Breeder Award Programs/Breeder Participation Programs
    • +
    • Easily copy lots, rules, and users between auctions
    • +
    • One click export of data to generate marketing lists
    • +
    • Different seller and club cuts for club members
    • Automatic invoicing
    • +
    • Make other users admins to help run the auction
    • ...and more!

    + {% include 'youtube_embed.html' with videoId=in_person_tutorial chapters=in_person_tutorial_chapters %}
    - - - -

    Ready to get started?

    diff --git a/auctions/templates/youtube_embed.html b/auctions/templates/youtube_embed.html new file mode 100755 index 0000000..f1c6798 --- /dev/null +++ b/auctions/templates/youtube_embed.html @@ -0,0 +1,69 @@ +
    +
    +
    + + + +{% if chapters %} +
    +
    Jump to content in this video
    +
      + {% for seconds, chapter in chapters %} +
    • {{ chapter }}
    • + {% endfor %} +
    +
    +{% endif %} diff --git a/auctions/urls.py b/auctions/urls.py index a77df16..07cdcb9 100755 --- a/auctions/urls.py +++ b/auctions/urls.py @@ -173,6 +173,11 @@ login_required(views.AuctionUsers.as_view()), name="auction_tos_list", ), + path( + "auctions//help/", + login_required(views.AuctionHelp.as_view()), + name="auction_help", + ), path( "auctions//users/bulk-add/", login_required(views.BulkAddUsers.as_view()), diff --git a/auctions/views.py b/auctions/views.py index 10d2b00..3cface2 100755 --- a/auctions/views.py +++ b/auctions/views.py @@ -394,7 +394,8 @@ class LotListView(AjaxListView): model = Lot template_name = "all_lots.html" auction = None - routeByLastAuction = False # to display the banner telling users why they are not seeing lots for all auctions + # to display the banner telling users why they are not seeing lots for all auctions + routeByLastAuction = False def get_page_template(self): try: @@ -1398,7 +1399,7 @@ def auctionReport(request, slug): .order_by("createdon") ) # .annotate(distance_traveled=distance_to(\ - #'`auctions_userdata`.`latitude`', '`auctions_userdata`.`longitude`', \ + # '`auctions_userdata`.`latitude`', '`auctions_userdata`.`longitude`', \ # lat_field_name='`auctions_pickuplocation`.`latitude`',\ # lng_field_name="`auctions_pickuplocation`.`longitude`",\ # approximate_distance_to=1)\ @@ -2020,6 +2021,24 @@ def get_context_data(self, **kwargs): return context +class AuctionHelp(AdminEmailMixin, TemplateView, AuctionPermissionsMixin): + template_name = "auction_help.html" + + def dispatch(self, request, *args, **kwargs): + self.auction = ( + Auction.objects.exclude(is_deleted=True) + .filter(slug=kwargs.pop("slug")) + .first() + ) + self.is_auction_admin + return super().dispatch(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["auction"] = self.auction + return context + + class AuctionUsers(SingleTableMixin, FilterView, AuctionPermissionsMixin): """List of users (AuctionTOS) associated with an auction""" @@ -4063,6 +4082,10 @@ class PromoSite(TemplateView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context["hide_google_login"] = True + context["online_tutorial"] = settings.ONLINE_TUTORIAL_YOUTUBE_ID + context["in_person_tutorial"] = settings.IN_PERSON_TUTORIAL_YOUTUBE_ID + context["in_person_tutorial_chapters"] = settings.IN_PERSON_TUTORIAL_CHAPTERS + context["online_tutorial_chapters"] = settings.ONLINE_TUTORIAL_CHAPTERS return context @@ -4243,7 +4266,8 @@ class AllLots(LotListView, AuctionPermissionsMixin): """Show all lots""" rewrite_url = ( - None # use JS to rewrite the shown URL. This is used only for auctions. + # use JS to rewrite the shown URL. This is used only for auctions. + None ) auction = None allow_non_admins = True @@ -4339,7 +4363,8 @@ class InvoiceView(DetailView, FormMixin, AuctionPermissionsMixin): template_name = "invoice.html" model = Invoice # form_class = InvoiceUpdateForm - form_view = "opened" # expects opened or printed, this field will be set to true when the user the invoice is for opens it + # expects opened or printed, this field will be set to true when the user the invoice is for opens it + form_view = "opened" allow_non_admins = True authorized_by_default = False @@ -4749,7 +4774,8 @@ def create_labels(self, request, *args, **kwargs): style, ) labels_row.append([label_text_cell]) - labels_row.append([Paragraph("", style)]) # margin right cell is empty + # margin right cell is empty + labels_row.append([Paragraph("", style)]) # Check if the current label is the last label in the current row or the last label in the list if (i + 1) % num_cols == 0 or i == len(labels) - 1: @@ -5149,7 +5175,8 @@ def dispatch(self, request, *args, **kwargs): def get_success_url(self): data = self.request.GET.copy() if len(data) == 0: - data["next"] = reverse("account") # "/users/" + str(self.kwargs['pk']) + # "/users/" + str(self.kwargs['pk']) + data["next"] = reverse("account") return data["next"] @@ -5922,7 +5949,7 @@ def get_data(self): { "x": (lot.date_end - self.end_date).total_seconds() // 60, # minutes after auction start - #'x': lot.date_end.timestamp() * 1000, # this one gives js timestamps and would need moment.js to convert to date + # 'x': lot.date_end.timestamp() * 1000, # this one gives js timestamps and would need moment.js to convert to date "y": lot.winning_price, } for lot in self.lots diff --git a/fishauctions/settings.py b/fishauctions/settings.py index ebe3d23..ffe4854 100755 --- a/fishauctions/settings.py +++ b/fishauctions/settings.py @@ -90,7 +90,7 @@ "django.contrib.messages", "django.contrib.staticfiles", "django_extensions", - #'site_settings', + # 'site_settings', "crispy_forms", "django.contrib.sites", "allauth", @@ -104,7 +104,7 @@ "post_office", "location_field", "channels", - #'debug_toolbar', # having this enabled is handy for sql queries but silences errors in channels + # 'debug_toolbar', # having this enabled is handy for sql queries but silences errors in channels "markdownfield", "qr_code", "django_tables2", @@ -312,7 +312,7 @@ "": { "ad": {"size": (250, 150), "crop": False}, "lot_list": {"size": (250, 150), "crop": "smart"}, - #'lot_full': {'size': (600, 600), 'crop': False}, + # 'lot_full': {'size': (600, 600), 'crop': False}, }, } THUMBNAIL_DEFAULT_STORAGE_ALIAS = "default" @@ -377,7 +377,8 @@ DEFAULT_AUTO_FIELD = "django.db.models.AutoField" -SEND_WELCOME_EMAIL = True # when a user adds an unverified email address to their auction, send an email about the site +# when a user adds an unverified email address to their auction, send an email about the site +SEND_WELCOME_EMAIL = True DATA_UPLOAD_MAX_NUMBER_FIELDS = 20000 @@ -442,3 +443,53 @@ "new", "test", ] +ONLINE_TUTORIAL_YOUTUBE_ID = "mNcOjAakC4c" +ONLINE_TUTORIAL_CHAPTERS = ( + (0, "Intro"), + (45, "Account creation"), + (1 * 60 + 25, "Auction creation"), + (1 * 60 + 49, "Setting the location to exchange lots"), + (2 * 60 + 37, "Rules"), + (4 * 60 + 2, "Joining the auction"), + (5 * 60 + 2, "Adding lots"), + (6 * 60 + 30, "Copying lots"), + (6 * 60 + 51, "Issues with joining your auction"), + (8 * 60 + 58, "Bidding and proxy bidding"), + (9 * 60 + 49, "Sniping and the end of the auction"), + (11 * 60 + 11, "Invoices"), + (12 * 60 + 9, "Paypal Batch Invoicing"), + (13 * 60 + 12, "What happens if someone doesn't pay?"), + (14 * 60 + 20, "Lot labels"), + (15 * 60 + 23, "Stats"), + (17 * 60 + 13, "Multi-location auctions"), + (19 * 60 + 29, "Help and support"), +) +IN_PERSON_TUTORIAL_YOUTUBE_ID = "BXnoMMU_aCQ" +IN_PERSON_TUTORIAL_CHAPTERS = ( + (0, "Intro"), + (36, "Account creation"), + (1 * 60 + 17, "Auction creation"), + (1 * 60 + 45, "Rules"), + (2 * 60 + 54, "Location"), + (3 * 60 + 22, "Joining the auction"), + (3 * 60 + 44, "Adding users manually"), + (4 * 60 + 31, "Users joining your auction"), + (4 * 60 + 47, "Auction administrators"), + (5 * 60 + 42, "Adding lots"), + (6 * 60 + 10, "Editing lots"), + (6 * 60 + 34, "Users adding lots"), + (7 * 60 + 38, "Lot labels"), + (8 * 60 + 37, "The auction itself: Set lot winners"), + (9 * 60 + 50, "Some common issues with selling lots"), + (11 * 60 + 1, "Invoices and payments"), + (13 * 60 + 3, "Auction hall layout"), + (14 * 60 + 5, "Images and lots"), + (14 * 60 + 45, "Selling fees discounts for club members"), + (15 * 60 + 52, "Changing bidder numbers"), + (16 * 60 + 38, "Stats"), + (18 * 60 + 54, "Attrition and Buy Now"), + (22 * 60 + 50, "Reusing rules in your next auction"), + (23 * 60 + 25, "Copying users between auctions"), + (24 * 60 + 00, "Advertising"), + (24 * 60 + 52, "Help and Support"), +)