Ignorance as an asset
In 2003, Harvard Business Review published a short article entitled "Wanted: Chief Ignorance Officer" in which the author described the benefits of ignorance. Long considered a detriment, this article cataloged all the advantages of ignorance.
Multi-page Forms in Django
Multi-page, or multi-step, forms are a common way to manage complex user inputs. This technical post outlines the techniques we use to build them in Django.
The importance of randomness in online security
I recently visited the website random.org, which is a free/fee-based generator of random numbers. It's been around for a long time - since 1998. It made me revisit the concept of randomness and how oddly hard it is to achieve. Why is randomness important? It's amazing how many things rely…
How to keep all your websites in sync with scraping technology
Would you like to pull in the header and/or footer from a related but separate website for use on your own pages? Here's how.
Using HubSpot’s Custom CRM Cards Without an Integration
The marketing software company HubSpot offers a nifty feature called "custom CRM cards." The idea is that a HubSpot dashboard can send a GET request to an API that you maintain, retrieve some JSON-formatted information and render it in some "cards" alongside other data. One of our clients wished to use…
Implementing dependency management with Python Poetry
One of the biggest issues with Python (our preferred development language) is dependency management. Any individual deployment can result in minor differences in the versions of the files and libraries which make up the application. And these minor variations introduce uncertainty and randomness into our deployment process. So, we've investigated…
Healthcare content too complex, a study
A new study accepted for publication in the British Journal of General Practice asserts that the majority of general practice websites contain content well above the recommended reading level for online content. The study analyzed 3,823 pages of content scraped from 813 Scottish general practice websites. Analysis showed that 2,942 pages…
Make sure you always have the current copyright year in your footer
Whenever I go to a website, my eyes go immediately to the year. You'd be surprised how many websites say 2006 or 2002 or even 1999. At best, is demonstrates no attention to details and at worst it proclaims the site as abandoned. At Imaginary, we have our site and...
Migrate Away from cmsplugin-filer in a Few Easy Steps
Companion code for this post: https://github.com/ImaginaryLandscape/deprecate_cmsplugin_filer If you've been building projects using django CMS for any length of time, chances are you're familiar with Divio's cmsplugin-filer application which provided image, link, file, folder and video plugins for interacting with django-filer. And if you're here, chances are you're aware that cmsplugin-filer has now...
Upgrade Django 1.11 to 2.2 and django CMS 3.4 to 3.7
Through the use of the Poetry project, incremental changes, and a little luck, the Django 1.11 -> 2.2 and django CMS 3.4 -> 3.7 upgrade was a success, but not without some excessively harsh profanity.
Adding Conditional Multifactor Authentication
The ability to bypass multifactor authentication can be useful in certain use cases.
The Key(s) to Client Collaboration
Imaginary has implemented two high tech tools to foster a decidedly low tech essential for success - frequent and productive client collaboration.
Tuning Site Search for Covid-19
The recent spike in usage of the term covid-19 introduced some inconsistent results in Imaginary’s custom site search engine, iScraper, a tool which utilizes Elasticsearch as its indexing engine. We’ll take a closer look at these results and show how we corrected the problem with an Elasticsearch configuration change. iScraper...
Website Search using Django and PostgreSQL Trigrams
Over the years I've become increasingly wary of the word "easy" in software documentation. Pick a software project at random, and there's a good chance the documentation will lead off with something like "Booloogent makes the process of frobnifying your wakalixes easy!" And then you try to use the package...
The absurdity of the fight against accessible websites
2019 was an interesting year in website accessibility. The simple and elegant premise of accessibility has been pushed aside by aggressive law firms, miserly corporations and apathetic regulatory agencies. In October the Supreme Court decided not to hear the appeal of Guillermo Robles v. Domino’s Pizza LLC. The background is...
Django shell_plus with Pandas, and Jupyter Notebook
The Django shell provides an environment where developers can interact with the database via Django's ORM. While the shell is great for basic interactions, it quickly becomes laborious to work in, be it due to manual imports, having to scroll through shell history to repeat commands, or working with / viewing queries returning more than, say, 20 records. These issues, and more, can be remedied by interacting with the ORM in Jupyter notebooks, using Pandas.
Two very important (and overlooked) requirements for a new website vendor relationship
In the world of web development, particularly open source web development, there are two fundamental requirements that you should ask of any new web development vendor – code isolation and server isolation. Whenever possible, you must insist that the underlying code that runs your website is isolated and under your...
Guide to Ansible/NGINX/uWSGI/Django, Part 2: Getting uWSGI Working with NGINX and Django
In Part 1 of this post, I described the trials, tribulations and ultimate success of running Ansible to provision a cloud server, which we do often here at Imaginary Landscape. Part 2 concludes the post by describing the process for getting uWSGI working with NGINX and Django. When I first tested the...
Guide to Ansible/NGINX/uWSGI/Django, Part 1: Running the Ansible Scripts
Here at Imaginary Landscape, we are frequently tasked with spinning up new cloud servers for our clients. Once a new server is online, we usually follow up by provisioning it with useful software. To automate that process, we began using Ansible a few years ago, and have had a lot...
Step-by-Step Guide to Setting up Django-RQ
Modern websites are complicated pieces of machinery. The requests they initiate can be intensive and take more time to complete than a typical HTTP request-response cycle. This is typically refererd to as a blocking request, in that the browser (and user) waits until the response is received. If the request...
Scraping pdf, doc, and docx with Scrapy
In February 2017, Google announced its plans to discontinue its Google Site Search product. Those clients of Imaginary Landscape who had relied on Google to provide their users with a search engine service for their website looked to us for a new solution. Finding no obvious equivalent replacement, we decided to create our own website scraper and accompanying search app.
Continuous Integration and Deployment with Drone, Docker, Django, Gunicorn and Nginx - Part 3
Django Web Development, Django Web Framework, Integration and Deployment with Drone, Docker, Django, Gunicorn and Nginx